System.Object 是 .NET 中所有類型的根嗎?
Written by Allen Lee
這不是廢話嗎?每個人一接觸 .NET 就會被提醒任何類型都是直接或者間接繼承自 System.Object 的,即使 MSDN 也記錄著類似的話。事實果真如此嗎?如果你在命令列介面輸入 ilasm /?,將會發現這樣一個參數:
/NOAUTOINHERIT Disable inheriting from System.Object by default
現在,我嘗試利用這個參數做一個沒有基類的託管類型。首先,開啟記事本,寫下如下代碼:
// Adam.cs
public class Adam
{
public void Hello()
{
System.Console.WriteLine("I have no parents!");
}
}
用 csc /t:library Adam.cs 把 Adam.cs 編譯成 Adam.dll。接著,在記事本裡寫下如下代碼:
// Program.cs
class Program
{
static void Main()
{
Adam adam = new Adam();
adam.Hello();
}
}
並用 csc /r:Adam.dl Program.cs 把 Program.cs 編譯成 Program.exe。運行一下這個程式,得到如下輸出:
I have no parents!
當然,此時的 Adam 還不是真正沒有 parent 的。現在,用 ILDASM 開啟 Adam.dll,依次選擇 File -> Dump 菜單,點擊 OK,把 IL 代碼另存新檔 Adam.il。接著,用記事本開啟 Adam.il,找到 Adam 的定義,把它後面的 extends [mscorlib]System.Object 注釋掉,儲存、退出。然後,在命令列裡輸入 ilasm /dll /noautoinherit adam.il,得到新的 Adam.dll。現在,再次運行 Program.exe,雖然輸出和之前一樣,但當你使用 ILDASM 查看 Adam.dll 裡的 Adam 類時,你發現它已經變成“真正的亞當”了!就連 Reflector 也說它沒有 Base Types 了,呵呵~~~
然而,我不禁自問,這樣一個類究竟有什麼用呢?如果沒有用處,那麼 Microsoft 又為何在 2.0 中引入 /noautoinherit 這樣一個參數呢?