在介紹 C# 的託管類型和非託管類型之前,我們先來說說 C# 的類型體系以及各種類型在內存(虛擬內存)中的存儲方式。
C# 類型體系
C# 的類型包含以下三大類:
- 值類型
- 枚舉
- 結構
- 數值類型(numeric)
- 布爾類型(bool)
- 用戶定義的結構(structure)
值類型的變量直接包含其數據。對於值類型,每個變量都具有其自己的數據副本,對一個變量執行的操作不會影響另一個變量(in、ref 和 out 參數變量除外;請參閱 in、ref 和 out 參數修飾符)。
引用類型的變量存儲對其數據(對象)的引用。對於引用類型,兩個變量可引用同一對象。因此,對一個變量執行的操作會影響另一個變量所引用的對象。
指針類型不從對象(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
非託管類型包括枚舉、指針和不包含引用類型成員(字段、屬性)的結構:
如果某個類型是以下類型之一,則它是非託管類型 :