1. 程式人生 > >類與結構體的區別

類與結構體的區別

##區別

  • 結構體是值型別,類是引用型別
  • 結構體成員不能從繼承自其他類或結構體,也不能被其他類或結構體繼承(但可以實現介面),然而類可以(注意,所有的值型別都預設從ValueType類繼承,ValueType類再從Object類繼承。所以結構體物件仍然擁有超類Object的成員)。
  • 結構體成員不能在宣告時賦值初始值,類可以(實際上,C#類成員初始化程式碼會被編譯器放到建構函式中的最前邊部分執行,而C++中根本沒有這種方式,只能宣告成員)
  • 不能為結構體提供無參建構函式(類中如果提供了自定義建構函式,就不會再提供預設無參建構函式。)
  • 結構體可以像類一樣通過new 建構函式()來建立例項,也可以宣告例項之後再賦值(例如:Person xiaoming;
    xiaoming.name
    = “xiaoming”;)
  • 結構體在自定義建構函式中必須為所有成員賦值。
  • 結構不允許宣告解構函式(Destructor),類則無此限制
  • 結構體之間的比較,可以使用Equals而不能使用==操作符。且當結構體有成員是引用型別時,成員的比較是用 Object.ReferenceEquals 實現,即該引用型別的成員是否指向相同的引用(可能會讓人誤解,因為使用者可能只是想比較數值相同)

##使用結構體還是類?

  • 因為結構體是值型別,自身儲存在棧上,主要用於輕量級物件,用來儲存簡單的資料(此時結構體的成員也大部分是值型別)。
  • 因為類是引用型別,可以抽象、繼承等,適合儲存重量級物件,擁有複雜邏輯(結構體不能被繼承,也不能繼承自其他,不能用abstract關鍵字等)
  • Pass:C++裡的類和結構體是