C#类型
C#中的类型有两种:
(1)值类型-valueType
值类型的变量直接包含它们的数据
值类型包括:简单数据类型(int、float、bool、double、byte、char等等)、枚举类型(EnumType)、结构类型(StructType)
struct MyStruct { public int value; } class Test { static void setValue(MyStruct st) { st.value = 11111; } static void Main() { //在堆栈上创建m1,并直接存储了对象数据 MyStruct m1 = new MyStruct(); m1.value = 199; //在堆栈上创建了一个m1的副本,副本里有自己的对象数据 MyStruct m2 = m1; //只是修改了m2这个副本自己本身的对象数据 m2.value = 299; //把m2当做参数传递,因为m2是值类型,所以在函数体内其实修改的是m2的一个副本,m2自身的值不会改变 setValue(m2); Console.WriteLine("m1.value = " + m1.value);//结果199 Console.WriteLine("m2.value = " + m2.value);//结果299 } }
(2)引用类型-referenceType
引用类型的变量存储的是对相应数据的引用
引用类型包括:类类型(ClassType)、接口类型(InterfaceType)、数组类型(ArrayTpye)、委托类型(DelegateType)
class MyClass { public int value; } class Test { static void setValue(MyClass ms) { ms.value = 11111; } static void Main() { //堆栈上的m1存放的是托管堆上对象的地址 MyClass m1 = new MyClass(); m1.value = 199; //在堆栈上新建一个m2,引用的地址和m1是一样的,都是指向同一块托管堆上的内存对象 MyClass m2 = m1; //对m2的修改,影响到了托管堆上的数值 m2.value = 299; //把m2当做参数传递,因为m2是引用类型,这时形参复制了它的引用地址,临时变量的引用也指向托管堆的内存空间 setValue(m2); Console.WriteLine("m1.value = " + m1.value);//结果11111 Console.WriteLine("m2.value = " + m2.value);//结果11111 } }