標籤:複製 通過 int frame 初始化 分配 引用 ring har
CLR支援兩種類型:參考型別和實值型別。
參考型別總是從託管堆上分配,實值型別一般線上程棧上分配。
在.NET Framework SDK中指出,任何稱為類的類型都是參考型別,所有實值型別都成為結構或枚舉
以下代碼示範實值型別與參考型別區別
class someref{ public int x;//參考型別}struct someval{ public int x;//實值型別}namespace 實值型別_參考型別{ class Program { static void Main(string[] args) { someref r1 = new someref();//在堆上分配 someval v1 = new someval();//在棧上分配 r1.x = 5;//提領指標 v1.x = 5;//在棧上修改 Console.WriteLine(r1.x);//顯示5 Console.WriteLine(v1.x);//顯示5 Console.ReadKey(); someref r2 = r1;//只複製引用(指標) someval v2 = v1;//在棧上從新分配並複製成員 r1.x = 8;//r1,r2會同時改變,因為r1跟r2指向同一個東西 v1.x = 9;//只改變v1,v2不變,因為v1,v2是兩個東西 Console.WriteLine(r1.x);//顯示8 Console.WriteLine(r2.x);//顯示8 Console.WriteLine(v1.x);//顯示9 Console.WriteLine(v2.x);//顯示5 } }}
實值型別與參考型別的一些區別
實值型別有已裝箱和未裝箱兩種形式,,參考型別總是處於已裝箱形式。
實值型別從System.ValueType派生,該類型直接從System.Object派生,他重寫了System.Object的Equals和GetHashCode方法。
實值型別不能作為基類定義一個新的基底類型或者參考型別,所以不能再實值型別中引入新的虛方法,所有方法不能是抽象的,所有方法都不能重寫。
參考型別的變數包含的是堆上的一個對象的地址。預設建立時被初始化為null,表明參考型別的變數當前不指向一個有效對象。實值型別的標量重視包含其基礎類型的一個值,而且
實值型別的所有成員都初始化為0,。
將一個實值型別的變數賦給另一個實值型別變數時會進行一次逐欄位的複製。將參考型別的變數賦給另一個參考型別時,只複製記憶體位址(如上例)。
基於上一條,可能會有多個參考型別變數引用堆中的同一個對象,所以對一個變數的操作可能會影響其他變數引用的對象。相反實值型別不會。
由於未裝箱的實值型別不在堆上分配,當定義該類型的方法不處於活動狀態時就會被釋放,也不會通過Finalize方法接收到通知。
參考型別和實值型別