C#型別轉換和GetType方法

2020-07-16 10:04:46
在執行時,可以通過 GetType 方法獲得物件指向的型別物件的型別。

當需要型別轉換時,有如下的幾種情況:
  • 將一個物件轉換為它的基本類型。
  • 將一個物件轉換為它的派生型別。
  • 將一個物件轉換為和它無關的型別(不是基礎類別也不是派生類)。

假設我們有如下的兩個類:
public class A
{
    public int a { get; set; }
}
publie class B : A
{
    public int b { get; set; }
}

將一個物件轉換為它的基本類型

這種情況永遠都能轉換成功,所以 C# 不要求額外的語法。當然,也可以使用顯式轉換:
A a = new B();
Console.WriteLine(a.GetType() ) ; // B
A a2 = (A)new B();
Console.WriteLine (a2 . GetType () ) ; // B
此時,我們看到 GetType 方法返回的值是“當前名稱空間名 .B”。

但是如果我們試圖在 Visual Studio 中存取物件 a/a2 的成員,會發現它只有 a —個成員,並沒有 b (實際上,可以編寫 IL 存取 B 的方法)。那麼 a/a2 的型別究竟是什麼呢?(答案是A)

實際上,根據之前物件初始化的知識,我們已經知道,在使用 new 關鍵字時,會在堆上初始化型別物件和普通物件。

當我們執行完上面的四行程式碼之後,記憶體中的布局大家應該可以想象出來了,如下圖所示。

運行完上面四行代碼後的內存布局