.NET中值或引用类型在内存中的创建
对于申明的一个值或引用类型的变量在内存中,是创建到堆还是栈上,经常看到的说法是:
1. 值类型创建在栈上
2. 引用类型创建在堆上
对于上述的说法其实不完备。这里要注意的是分清楚什么是变量,什么是变量的值。
实际上对于申明的变量如何分配内存还要依赖申明的变量所在的上下文环境,具体来说,有以下几个规则:
1. 每个局部变量(包括方法内部申明的) 都在栈上创建,包括引用类型的变量(仅仅是变量本身,不是变量指向的某个实例,也就是变量的值)。方法参数表中除了申明为ref的参数外也是在栈上创建局部变量,ref参数则不会创建局部变量,它共享使用调用者的变量。
2. 引用类型的实例都是在堆上创建。
3. 值类型的实例则创建在与变量申明时所在上下文的地方。
4. 每个静态变量都是在堆上创建。