C#中的struct(結構)為值型別,struct型別全接觸
眾所周知,struct型別和class型別非常相似,尤其是在C++中,class可以辦到的事struct幾乎都可以實現。在C#中struc型別依然存在,它的用處相對來說已經顯得越來越不重要,這裡主要講述一下C#中struct和class的一個最大不同點,在C#中struct是值型別,而class是引用型別。
例:
classProgram
{
structTest
{
publicint a ;
}
staticvoid Main(string[] args)
{
Test test1 = newTest();
test1.a = 1;
Test test2 = test1;
Console.WriteLine("test1.a=" + test1.a);
Console.WriteLine("test2.a=" + test2.a);
test2.a = 2;
Console.WriteLine("test1.a=" + test1.a);
Console.WriteLine("test2.a=" + test2.a);
Console.ReadLine();
}
}
執行上面的程式,輸出地結果會是:
test1.a=1
test2.a=1
test1.a=1
test2.a=2
test2的變化對test1沒有任何的影響,test1和test2對應兩個不同的記憶體區域,如果把struct改為class,則會輸出:
test1.a=1
test2.a=1
test1.a=2
test2.a=2
C#把基本型別規定為值型別,而把包含許多欄位的較大型別規定為引用型別,C#設計這種方式的最大原因是可以得到最大的效能。當我們進行專案開發的時候,自定義型別可以選擇class也可以選擇struct,但如果希望自己的型別是值型別(有時候這樣做是非常必要的),則應把它宣告為一個結構型別。
此外,結構還有很多特性需要我們注意,總結如下:
1、所有結構都從Object類派生,不能從其他類或者結構派生,也不能作為其他類或結構的基類。
2、結構中的欄位預設是私有的,並且結構的欄位不能在宣告時顯示初始化。
3、結構可以有一個或多個構造方法,但是不允許自己定義預設建構函式,而且編譯器要求自定義建構函式都要初始化結構的所有欄位。
4、結構的預設建構函式將所有值型別的欄位設為0,所有引用型別的欄位設為空引用。
下面對1進行一下說明,結構型別不能從其他類或結構派生是指我們不能顯示的加繼承語句“:SomeClass”,實際上在我們定義結構型別的時候,系統進行了隱式繼承,所繼承的基類就是System.ValueType。請看下面的示例:
struct Test
{
public int a;
public int b;
}
上面定義了一個結構型別Test,下面是其IL程式碼:
.class private sequential ansi sealed beforefieldinit ConsoleApplication1.Test
extends [mscorlib]System.ValueType
{
} // end of class ConsoleApplication1.Test
我們可以很清楚的看到Test繼承了System.ValueType類。讀者朋友可以檢視一下.NET所有基本資料型別的原始碼,他們都是結構型別的(用struct關鍵字定義的),並且在定義的過程中隱式繼承了System.ValueType。