1. 程式人生 > >值類型與引用類型

值類型與引用類型

val 高精度 type inter 派生 obj gate 精度 枚舉

區別:

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

裝箱:將值類型轉換為引用類型 。裝箱時,生成的是全新的引用對象,這會有時間損耗,也就是造成效率降低,盡量避免裝箱。
拆箱:將引用類型轉換為值類型。

值類型與引用類型