在.Net中有全局变量、局部变量、静态成员变量、非静态成员变量,另外变量还分为值类型和引用类型,今天主要是针对这些内容做个总结。
在.Net Framework里面,CLR中存在2个内存管理的区域,一个是堆栈,一个就是托管堆.如果是值类型,CLR会在堆栈里面分配一个内存给它,而如果是引用类型,如string,object,类类型等等,CLR会在堆栈里面分配一个引用的地址,而new一个对象时候会在托管堆里面分配一块内存给这个引用.
首先说一下类成员变量,请看下面代码:
public class MemoryTest
{
double d = 0; //分配内存,并且是分配在托管堆中。因为MemoryTest作为引用类型,此值类型实例则属于MemoryTest的成员实例,所以被创建在GC上。也就是说根据所属实例是引用类型还是值类型分配在托管堆或堆栈上。与其本身是值类型还是引用类型无关。
string s = null; //在托管堆中分配引用地址,不指向任何内存有效位置
s = "ss"; //在托管堆中分配内存,并且把s的地址指向这块内存
decimal dd; //分配内存,因为编译器会给它赋予初始值
public void MemoryDistribute(){
byte bt = 0; //分配内存,分配在堆栈中
}
}
上面说到引用类型嵌套值类型,反过来呢,值类型嵌套引用类型呢,请看下面代码:
public struct MemoryStruct
{
public MemberTest MemberTest;
public void MemoryStructMethod()
{
MemberTest = new MemberTest();
MemberTest.d = 1; //还是在托管堆中
}
}