[你必須知道的.NET] 第四回:后來居上:class和struct

作者: Anytao  來源: 博客園  發布時間: 2008-09-11 16:22  閱讀: 5147 次  推薦: 0   原文鏈接   [收藏]  
 
[1] [你必須知道的.NET] 第四回:后來居上:class和struct
[2] [你必須知道的.NET] 第四回:后來居上:class和struct

系列文章導航:

[你必須知道的.NET] 開篇有益

[你必須知道的.NET] 第一回:恩怨情仇:is和as

[你必須知道的.NET] 第二回:對抽象編程:接口和抽象類

[你必須知道的.NET] 第三回:歷史糾葛:特性和屬性

[你必須知道的.NET] 第四回:后來居上:class和struct

[你必須知道的.NET] 第五回:深入淺出關鍵字---把new說透

[你必須知道的.NET] 第六回:深入淺出關鍵字---base和this

[你必須知道的.NET] 第七回:品味類型---從通用類型系統開始

[你必須知道的.NET] 第八回:品味類型---值類型與引用類型(上)-內存有理

[你必須知道的.NET] 第九回:品味類型---值類型與引用類型(中)-規則無邊

[你必須知道的.NET] 第十回:品味類型---值類型與引用類型(下)-應用征途

[你必須知道的.NET] 第十一回:參數之惑---傳遞的藝術(上)

[你必須知道的.NET] 第十二回:參數之惑---傳遞的藝術(下)

[你必須知道的.NET] 第十三回:從Hello, world開始認識IL

[你必須知道的.NET] 第十四回:認識IL代碼---從開始到現在

[你必須知道的.NET] 第十五回:繼承本質論

[你必須知道的.NET] 第十六回:深入淺出關鍵字---using全接觸

[你必須知道的.NET] 第十七回:貌合神離:覆寫和重載

[你必須知道的.NET] 第十八回:對象創建始末(上)

[你必須知道的.NET] 第十九回:對象創建始末(下)

[你必須知道的.NET]第二十回:學習方法論

[你必須知道的.NET]第二十一回:認識全面的null

[你必須知道的.NET]第二十二回:字符串駐留(上)---帶著問題思考

[你必須知道的.NET]第三十二回,深入.NET 4.0之,Tuple一二

 

  本文將介紹以下內容:

  • 面向對象基本概念

  • 類和結構體簡介

  • 引用類型和值類型區別

  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不能從class繼承,也不能作為class的基類,但struct支持接口繼承(記得嗎,《第二回:對抽象編程:接口和抽象類》也做過討論)

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

  • 實例化時,class要使用new關鍵字;而struct可以不使用new關鍵字,如果不以new來實例化struct,則其所有的字段將處于未分配狀態,直到所有字段完成初始化,否則引用未賦值的字段會導致編譯錯誤。

  • 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橫行的天下。

[第1頁][第2頁]
0
0
 
標簽:.NET class struct
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()