1.C#语音的数据类型分为三种:值类型、引用类型、指针类型。指针类型进应用于安全代码中。
值类型:值类型变量存储的是数据类型所代表的实际数据,值类型变量的值(或对象)存储在栈(Stack)中,赋值语句是传递变量的值。
引用类型:引用类型(类就是一个引用类型)的实例也叫对象,不存在栈(Stack)中,存储在可管理堆(Managed Heap)中,堆实际上计算机系统中的空闲内存。引用类型变量的值存储在栈(Stack)中,但存储的不是引用类型对象,存储的是引用类型对象的引用,即 地址,它和指针所表示的地址不一样,引用所代表的地址不能被修改,也不能转换成其他类型地址。它是引用型变量,只能引用指定类对象,引用类型变量赋值语句是传递对象的地址。见下例:
using System;
class MyClass//类为引用类型
{ public int a=0;
}
class Test
{ static void Main()
{ f1();
}
static public void f1()
{ int v1=1; //值类型变量v1,其值1 存储在栈(Stack)中
int v2=v1; //将v1 的值(为1)传递给v2,v2=1,v1 值不变。
v2=2; //v2=2,v1 值不变。
MyClass r1=new MyClass(); //引用变量r1 存储MyClass 类对象的地址
MyClass r2=r1; //r1 和r2 都代表是同一个MyClass 类对象
r2.a=2; //和语句r1.a=2 等价
}
}
存储在栈中的变量,当其生命周期结束,自动被撤销,例如,v1 存储在栈中,v1 和函数f1 同生命周期,退出函数f1,v1 不存在了。但在堆中的对象不能自动被撤销。。因此C和C++语言,在堆中建立的对象,不使用时必须用语句释放对象占用的存储空间。.NET 系统CLR 内建垃圾收集器,当对象的引用变量被撤销,表示对象的生命周期结束,垃圾收集器负责收回不被使用的对象占用的存储空间。例如,上例中引用变量r1 及r2 是MyClass类对象的引用,存储在栈中,退出函数f1,r1 和r2 都不存在了,在堆中的MyClass 类对象也就被垃圾收集器撤销。也就是说,CLR 具有自动内存管理功能。
2.C#值类型变量的分类