Class Struct 的區別

  1、引言

  提起class和struct,我們首先的感覺是語法幾乎相同,待遇卻天壤之別。歷史將接力棒由面向過程編程傳到面向對象編程,class和struct也揹負着各自的命運前行。在我認爲,struct英雄遲暮,class天下獨行,最本質的區別是class是引用類型,而struct是值類型,它們在內存中的分配情況有所區別。由此產生的一系列差異性,本文將做以全面討論。

2、基本概念

  2.1、什麼是class?

  class(類)是面向對象編程的基本概念,是一種自定義數據結構類型,通常包含字段、屬性、方法、構造函數、索引器、操作符等。因爲是基本的概念,所以不必在此詳細描述,讀者可以查詢相關概念瞭解。我們重點強調的是.NET中,所有的類都最終繼承自System.Object類,因此是一種引用類型,也就是說,new一個類的實例時,對象保存了該實例實際數據的引用地址,而對象的值保存在託管堆(managed heap)中。

  2.2、什麼是struct?

  struct(結構)是一種值類型,用於將一組相關的信息變量組織爲一個單一的變量實體。所有的結構都繼承自System.ValueType類,因此是一種值類型,也就是說,struct實例分配在線程的堆棧(stack)上,它本身存儲了值,而不包含指向該值的指針。所以在使用struct時,我們可以將其當作int、char這樣的基本類型類對待。

3、相同點,不同點

  相同點:語法類似。 

  不同點:

   class是引用類型,繼承自System.Object類; struct是值類型,繼承自System.ValueType類,因此不具多態性。但是注意,System.ValueType是個引用類型。 

   從職能觀點來看,class表現爲行爲; 而struct常用於存儲數據。 

   class支持繼承,可以繼承自類和接口; 而struct沒有繼承性,struct不能從類繼承,也不能作爲類的基類,但struct支持接口繼承。 

        class可以聲明無參構造函數,可以聲明析構函數; 而struct只能聲明帶參數構造函數,且不能聲明析構函數。因此,struct沒有自定義的默認無參構造函數,默認無參構造器只是簡單地把所有值初始化爲它們的0等價值。 

   實例化時,class要使用new關鍵字; 而struct可以不使用new關鍵字,struct在聲明時就進行了初始化過程,所有的成員變量均默認爲0或null。 

   class可以是抽象類(abstract),可以聲明抽象函數; 而struct爲抽象,也不能聲明抽象函數。 

   class可以聲明protected成員、virtual成員、sealed成員和override成員; 而struct不可以,但是值得注意的是,struct可以重載System.Object的3個虛方法,Equals()、ToString()和GetHashTable()。 

   class的對象複製分爲淺拷貝和深拷貝,必須經過特別的方法來完成複製; 而struct創建的對象複製簡單,可以直接以等號連接即可。 

   class實例由垃圾回收機制來保證內存的回收處理; 而struct變量使用完後立即自動解除內存分配。 

   作爲參數傳遞時,class變量是以按址方式傳遞; 而struct變量是以按值方式傳遞的。 


  我們可以簡單的理解,class是一個可以動的機器,有行爲,有多態,有繼承; 而struct就是個零件箱,組合了不同結構的零件。其實,class和struct最本質的區別就在於class是引用類型,內存分配於託管堆; 而struct是值類型,內存分配於線程的堆棧上。由此差異,導致了上述所有的不同點,所以只有深刻的理解內存分配的相關內容,才能更好的駕馭。本系列將再以後的內容中,將引用類型和值類型做以深入的比較和探討,敬請關注。當然正如本文標題描述的一樣,使用class基本可以替代struct的任何場合,class後來居上。雖然在某些方面struct有性能方面的優勢,但是在面向對象編程裏,基本是class橫行的天下。

  那麼,有人不免會提出,既然class幾乎可以完全替代struct來實現所有的功能,那麼struct還有存在的必要嗎?答案是,至少在以下情況下,鑑於性能上的考慮,我們應該考慮使用struct來代替class:

  ◆實現一個主要用於存儲數據的結構時,可以考慮struct。

  ◆struct變量佔有堆棧的空間,因此只適用於數據量相對小的場合。

  ◆結構數組具有更高的效率。

  ◆提供某些和非託管代碼通信的兼容性。

  所有這些是struct有一席之地的理由,當然也許還有其他的更多說法,只是我不知道罷了。 


      原文轉自:http://wenku.baidu.com/view/f62ac3eae009581b6bd9eb6b.html

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