標籤:組織 自訂 type .net 定義資料 概念 protected 垃圾 eth
class和struct文法幾乎相同,但其本質卻截然不同:class是參考型別,struct是實值型別,也就是說在記憶體中儲存方式有別,由此產生的一系列差異性。
class(類)是物件導向編程的基本概念,是一種自訂資料結構類型,通常包含欄位、屬性、方法、建構函式、索引器、事件等。在.NET中,所有的類都繼承自System.Object類,是一種參考型別,也就是說,當我們new出一個類的執行個體時,對象儲存了該執行個體實際資料的引用地址,而對象的值儲存在託管堆中。
struct(結構)是一種實值型別,用於將一組相關的資訊變數組織成為一個單一的變數實體。所有的結構都繼承自System.ValueType類,是一種實值型別,我們可以像使用int和char一樣去使用struct。struct執行個體分配線上程的堆棧上,它本身儲存了值,而不是指向該值的指標。
瞭解了class和struct的本質,我們可以通過分析和實驗來總結二者的區別:
(1)關於實質:class是參考型別,struct是實值型別
(2)關於職能:class是行為的封裝,用來表述對象,而struct是資料的封裝,用來儲存資料
(3)關於繼承:class支援繼承自類和介面;而struct只能支繼承介面。struct不能從class繼承,也不能作為class的基類。
(4)關於建構函式:class可以聲明無參建構函式,可以聲明解構函式;而struct只能聲明帶參數建構函式,且不能聲明解構函式。
(5)關於執行個體化:class要使用new關鍵字;而struct可以不使用new關鍵字,struct在聲明時就進行了初始化過程,所有的成員變數均預設為0或null。
(6)關於抽象:class可以實抽象類別(abstract),可以聲明抽象函數;而struct不能。
(7)關於重載:class可以聲明protected成員、virtual成員、sealed成員和override成員;而struct不可以,但是值得注意的是,struct可以重載System.Object的3個虛方法,Equals()、ToString()和GetHashTable()。
(8)關於比較:兩個class的比較有Equals和==兩種,即值相等和引用相同;而兩個struct可以直接通過==來判斷。
(9)關於銷毀:class執行個體由記憶體回收機制來保證記憶體的回收處理;而struct變數使用完後立即自動解除記憶體配置。
(10)關於參數傳遞:class變數是以按址方式傳遞;而struct變數是以按值方式傳遞的。
既然class幾乎可以完全替代struct來實現所有的功能,那麼struct還有存在的必要嗎?至少在以下情況下,我們應該考慮使用struct來代替class:
- 實現一個用於儲存資料的結構時,可以考慮struct。
- 考慮與某些Unmanaged 程式碼通訊的相容性問題時,可以考慮struct。
[C#基礎知識]Class和Struct的區別