c#变量内存分配

变量的声明并没有分配空间。引用他所分配的也只是一个指针,他所指的是变量名的地址。
一旦变量通过编译,系统会为他自动初始化,那样也就分配了空间。初始化值一般为零。

 

变量的声明占一个指针的空间
如果确定分配大小了,再加上大小的空间
但变量的指的实际空间的首地址

 

局部变量在定义时就已经分配空间,不过值类型的变量是直接分配默认值,引用类型的分配默认引用null。
引用类型变量的实例在new时在托管堆上分配内存。

类实例成员变量在类实例在实例被创建时分配一次,类实例杯创建多少次它就分配多少次。同样是分配默认值。

类静态成员变量在类第一次被引用时分配。

 

 

最关键搞清楚局部变量、值类型实例、引用类型实例和字段的概念。

值类型实例就是值类型的实例,如1,值类型变量i,只是储存值类型实例的容器。

引用类型实例就是引用来性的实例,如"123",其在托管堆上分配,引用类型变量s只是储存托管堆的地址。

字段就是隶属于类型的变量,也就是类型的成员变量。如果是实例字段,则在创建实例时分配内存空间,根据实例是引用类型还是值类型分配在托管堆或堆栈上。与其本身是值类型还是引用类型无关。但如果其是值类型,则直接保存值,如果其是引用类型,则还是保存引用。

静态字段在第一次引用类时分配空间。

 

 

局部变量是这样的。

如果局部变量除赋值外再未被使用,则它们根本就不会被创建(编译警告)。

如果局部变量未被赋值就被使用,则是编译错误。

即使是放在for( int i = 0; i < 5; i ++ )的循环中赋值。
但是有几个例外。

在while( true )循环中赋值可以。
do...while循环中赋值可以。
在for(;;)中可以
在if中可以,如果if块和else块都有赋值。
其他的情况大多数不可识别。


如果局部变量按照正常的流程走,在使用前赋值,从IL上看,这个时候它们是在函数开始处被定义的。至于是不是在这里分配空间,则因为堆栈复杂的操作,我不好下结论。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值