c# struct關鍵字深入

   在我們看面試題的時候,經常會出現這樣一個題目:

請描述struct與class的區別

那麼,到底struct是什麼呢?

 

菜鳥教程中這樣描述:在 C# 中,結構體是值類型數據結構。它使得一個單一變量可以存儲各種數據類型的相關數據

但是這樣好像並不能完全理解struct到底是什麼,爲什麼會出現這樣的題目。爲了說清楚這個題目,首先要了解一下值類型和引用類型的問題。所有的值類型都繼承於 system.valuetype , 所有的引用類型都繼承於 system.object

一切疑點定位到它聲明的地方就可以清晰,所以我們還是反編譯一下用證據說明一切:

聲明如下的struct變量

        public class SomeClassRef { public int x; }
        public struct SomeStructVal { public int x; }

 然後我們看一下反編譯後的內容

 

可以看到上圖中,struct繼承自valuetype,並且是一個sealed類。故而可以得出,abstract等關鍵字是不能出現在struct中的,且是不可以被繼承的。那麼,這樣就可以總結出struct與class的區別:

1.struct是值類型,class是引用類型

2.struct是密封類,不可以被繼承,同時也不可以有抽象方法、虛方法等 。class可以被繼承,也可以存在抽象方法虛方法等

3.struct可以不用new 直接使用 例如下面代碼,但是class不可以(這點爲什麼,暫時還不清楚實現原理)

           SomeStructVal str;
            str.x = 1;

4.如下圖,struct不能顯示的聲明無參構造函數,而類可以。

 

 

  

以上就是全部了,不過可以擴展答案,講一下值類型與引用類型的區別,例如:

1.值類型struct 存儲在棧上,引用類型class存儲在堆上

2.作爲參數傳遞時,值類型傳遞的是值,引用類型傳遞的是引用

3.值類型一般存儲小對象,引用類型可以存儲大對象

 

 

最後的最後,拓展一下值類型

我們一般情況講值類型有哪幾種的時候,會這樣描述:int,double等數值類型,bool類型,enum ,struct。但其實看一下數值類型和bool類型的定義(如下圖),可以知道這些也都是struct類型的。所以就很好的理解與記憶爲什麼這些是值類型的了

 

 

 

 

參考文檔:https://blog.csdn.net/xxdddail/article/details/36862275

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章