1. 程式人生 > >C#中的struct(結構)為值類型,struct類型全接觸

C#中的struct(結構)為值類型,struct類型全接觸

line 輸出 其他 重要 影響 初始化 最大 cat type類

眾所周知,struct類型和class類型非常相似,尤其是在C++中,class可以辦到的事struct幾乎都可以實現。在C#中struc類型依然存在,它的用處相對來說已經顯得越來越不重要,這裏主要講述一下C#中struct和class的一個最大不同點,在C#中struct是值類型,而class是引用類型。

例:

class Program

{

struct Test

{

public int a ;

}

static void Main(string[] args)

{

Test test1 = new Test();

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。

C#中的struct(結構)為值類型,struct類型全接觸