值类型和引用类型的总结
一、栈和堆的理解
栈是一种后进先出的数据结构,在内存中,变量被分配在栈上进行操作;堆是用来为对象分配空间的一块内存区域,在堆上创建一个对象时,会将对象的地址传递给栈上的变量,反过来叫变量引用该对象。
二、值类型
值类型包括了结构、枚举和一些简单类型如int、byte等,所有的值类型都隐式继承自System.ValueType这个类类型,而这个类型和引用类型全都继承自System.Object基类。
因为结构隐式继承自System.ValueType类型,所以结构不再支持继承。值操作在栈上进行,值操作是一种入栈出栈的过程。要想调用结构中的方法或变量时,需要对结构中的变量进行复赋值后才可使用。例如:
namespace test { class Program { static void Main(string[] args) { Student std=new Student(); Console.WriteLine(std.count); Console.ReadKey(); } } public struct Student { public int count; public void Listen() { } } }
代码中,Student std=new Student();是编译器隐式为结构创建无参数的构造函数,在构造函数中会对结构中的变量进行初始化,这样我们就省去了对结构中的变量逐一初始化。
这里,New操作符不分配内存,也不创建实例,只是调用了默认的构造函数来初始化结构中的所有字段。
三、引用类型
引用类型包括类、接口、委托等。
声明一个引用类型变量时,使用New操作符创建引用实例的时候,该变量被分配到线程栈上,变量保存了堆上的地址。当使用“==”对引用类型变量比较时,实际上是比较两个引用类型是否指向堆上的同一对象。
说明:string是一种特殊的引用类型。
四、装箱和拆箱
装箱:值类型转换成等价的引用类型。
大体过程:
1.在堆上为新生成的对象实例分配内存;
2.将栈上的值类型变量的值复制到堆上的对象中;
3.将堆上创建的对象地址返回给引用类型变量;
例如:
int i=1; object boxed = i; Console.WriteLine(boxed);
拆箱:将引用类型转换成值类型。
过程:
1.获取已装箱的对象地址;
2.将值从堆上的变量中复制到堆栈上的值变量中;
注意:频繁的在堆上进行操作将会大大消耗内存,因此在编程中尽量避免装箱拆箱过程。
女猿一枚,为生活而不断拼搏,相信努力定会有收获!