值类型与引用类型
在C#中,所有类型都可划分为值类型和引用类型。值类型包括简单类型、结构体类型和枚举类型;引用类型包括自定义类、数组、接口、委托等。
值类型直接存储其值,变量本身就包含了其实例数据,而引用类型保存的只是实例数据的内存引用。因此,一个值类型变量就永远不会影响到其他的值类型变量,而两个引用类型变量则很有可能指向同一地址,从而发生相互影响。
从内存分配上来看,值类型通常分配在线程的堆栈上,作用域结束时,所占空间自行释放,效率高,无需进行地址转换,而引用类型通常分配在托管堆上,由GC来控制其回收,需要进行地址转换,效率降低。
下面通过简单示例来演示值类型与引用类型的区别。
01 class MyInt //类是引用类型
02 {
03 public int I;
04 }
05 static void Main(string[] args)
06 {
07 int num1 = 123; //简单数据类型为值类型
08 int num2 = num1; //将值复制给新变量
09 num1 = 345; //修改num1的值并不影响num2的值
10 Console.WriteLine("num1={0,-10}num2={1}", num1, num2);
11 MyInt i1 = new MyInt(); //类类型为引用类型
12 i1.I = 123;
13 MyInt i2 = i1; //进行引用复制
14 i1.I = 345; //修改i1的值,将影响i2的值。
15 Console.WriteLine("i1.I={0,-10}i2.I={1}", i1.I, i2.I);
16 }
简单数据类型为值类型,这里用int类型为例,创建两个变量:num1和num2,其中num2的值是通过复制num1的值得到的,之后修改num1的值,因为值类型的变量分别进行存储,改变一个变量的值,并不会影响另一个变量的值,所以修改num1的值并不影响num2的值。
类类型为引用类型,这里创建了一个简单的自定义类MyInt(本书尚未涉及到面向对象的知识,如果您对类尚不熟悉,需要查阅相关资料进行学习),只包含一个简单的数据成员I。同样定义两个变量,i1和i2,i2是通过复制i1的引用完成的赋值,i1和i2占用同一块内存,任何一个变量值的变化,都会影响到另一个变量。这里修改i1的值,i2的值同时发生改变。
测试结果如下:
图 34 测试结果
关于值类型与引用类型,这里只能是给您介绍一下简单的概念,让您知道值类型与引用类型的存在,更多详细信息,您可查阅其他书籍或网络搜索相关资料,这里不再累述。