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


眾所周知,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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM