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

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

眾所周知,struct型別和class型別非常相似,尤其是在C++中,class可以辦到的事struct幾乎都可以實現。在C#struc型別依然存在,它的用處相對來說已經顯得越來越不重要,這裡主要講述一下C#structclass的一個最大不同點,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沒有任何的影響,test1test2對應兩個不同的記憶體區域,如果把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。