在我們看面試題的時候,經常會出現這樣一個題目:
請描述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