区别:
1:在存储区上的区别: 值类型是存储在栈上面的,引用类型是存储在堆上面的。
2:在赋值上,值类型是直接赋新值给变量,但是引用类型是开辟一块新的空间来存放新值,并将之前指向旧的值的那个地址改成指向新的值的地址。这就完成了一次赋值的操作。
在对应用类型进行赋值的时候: 首先,我们先从定义和赋初始值开始说起, 引用类型在被申明的时候,首先在堆中开辟一块内存空间,然后将其在堆中的地址赋值给 栈 中的一快空间,这块空间就是来放一个引用类型在堆中的地址的。然后我 对其进行重新赋值的时候,并不是将堆中的值给改变了,而是在堆中重新开辟了一块新的空间,然后将堆中的这个地址赋值给 之前这个变量在栈中开辟那块存堆中的地址的那个地址,所以之前的那个最先开辟在堆中的空间是不会被消除的,除非.Net FrameWork这个框架中的垃圾回收站自动帮我们完成释放内存的功能,但这是在程序运行结束后才会做,所以我们如果对引用类型的变量 的话,我们应该尽量减少对其的重新赋值,就想string这个引用类型一样,我们如果需要对字符串进行重复的赋值和处理,我们一般不会用string这个字符串来处理, 我们一般使用stringBuild 来处理字符串重新赋值的问题。
值类型:C#的所有值类型均隐式派生自System.ValueType;判断是否为值类型:Type.IsValueType
1.所有整形:sbyte(System.SByte)、short(System.Int16)、、int(System.Int32)、long(System.Int64)、byte(System.Byte)、ushort(System.UInt16)、uint(System.UInt32)、ulong(System.UInt64)、char(System.Char)。
2.所有浮点型:float (System.Single)、double(System.Double)。
3.高精度类型:decimal(System.Decimal)。
4.bool(System.Boolean);
5.结构体、枚举类型。
引用类型:
1.数组(派生于System.Array)
2.类:class(派生于System.Object)
3.接口:interface
4.委托类型:delegate(派生于System.Delegate)
5.字符串:string(System.String的别名)
6.Lambda表达式:C#的Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to”。语法如下:形参列表=>函数体函数体多于一条语句的可用大括号括起。如下:
delegate int del(int i);
del myDelegate = x=>{return x*x;};
int j = myDelegate(5);//j=25
装箱:将值类型转换为引用类型 。装箱时,生成的是全新的引用对象,这会有时间损耗,也就是造成效率降低,尽量避免装箱。
拆箱:将引用类型转换为值类型。