C#語法學習-託管類型、非託管類型

在介紹 C# 的託管類型和非託管類型之前,我們先來說說 C# 的類型體系以及各種類型在內存(虛擬內存)中的存儲方式。

C# 類型體系

C# 的類型包含以下三大類:

值類型的變量直接包含其數據。對於值類型,每個變量都具有其自己的數據副本,對一個變量執行的操作不會影響另一個變量(in、ref 和 out 參數變量除外;請參閱 inref 和 out 參數修飾符)。

引用類型的變量存儲對其數據(對象)的引用。對於引用類型,兩個變量可引用同一對象。因此,對一個變量執行的操作會影響另一個變量所引用的對象。

  • 指針類型
    • 整型指針(sbytebyteshortushortintuintlongulong
    • 浮點型指針(floatdouble
    • 小數型指針(decimal
    • 布爾型指針(boolean
    • 枚舉型指針(enum
    • 字符型指針(char
    • 指針型指針
    • 不包含託管類型成員的結構型指針,也就是非託管struct指針(只有非託管類型的字段的struct 是非託管類型struct,包含託管類型成員的struct是託管類型struct

指針類型不從對象(object)繼承,並且指針類型與對象(object)之間不存在轉換。 此外,裝箱和取消裝箱不支持指針。 但是,你可在不同的指針類型之間以及指針類型和整型之間進行轉換。

.NET 內存模型:

託管類型

託管類型包括 引用類型 以及 包含有引用類型或託管類型成員的結構

  • 引用類型
  • 含引用類型或託管類型成員(字段、自動實現 get 訪問器的屬性)的結構(managed structure)
// 託管結構。
public struct Foo { 
      public string Name; // 包含引用類型字段。
      public string Bar { get; private set; } // 包含自動實現 get 訪問器的引用類型屬性。
 }

 public struct Bar { 
      public Foo Foo; // 包含託管類型字段(託管結構)。
}

非託管類型  詳情:https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/builtin-types/unmanaged-types

非託管類型包括枚舉、指針和不包含引用類型成員(字段、屬性)的結構:

如果某個類型是以下類型之一,則它是非託管類型 :

  • sbytebyteshortushortintuintlongulongcharfloatdoubledecimal 或 bool
  • 任何枚舉類型
  • 任何指針類型
  • 任何用戶定義的 struct 類型,只包含非託管類型的字段
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章