[C#基礎知識]Class和Struct的區別

來源:互聯網
上載者:User

標籤:組織   自訂   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:

  1. 實現一個用於儲存資料的結構時,可以考慮struct。
  2. 考慮與某些Unmanaged 程式碼通訊的相容性問題時,可以考慮struct。

[C#基礎知識]Class和Struct的區別

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.