System.Object 是 .NET 中所有类型的根吗?
System.Object 是 .NET 中所有類型的根嗎?
?
Written by Allen Lee
?
這不是廢話嗎?每個人一接觸 .NET 就會被提醒任何類型都是直接或者間接繼承自 System.Object 的,即使 MSDN 也記錄著類似的話。事實果真如此嗎?如果你在命令行界面輸入 ilasm /?,將會發現這樣一個參數:
/NOAUTOINHERIT Disable inheriting from System.Object by default
現在,我嘗試利用這個參數做一個沒有基類的托管類型。首先,打開記事本,寫下如下代碼:
//?Adam.cspublic?class?Adam
{
??public?void?Hello()
??{
????System.Console.WriteLine("I?have?no?parents!");
??}
}
用 csc /t:library Adam.cs 把 Adam.cs 編譯成 Adam.dll。接著,在記事本里寫下如下代碼:
//?Program.csclass?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 這樣一個參數呢?
轉載于:https://www.cnblogs.com/allenlooplee/archive/2007/01/22/627386.html
總結
以上是生活随笔為你收集整理的System.Object 是 .NET 中所有类型的根吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 啥?分布式啥?啥事务?
- 下一篇: Redis 发布订阅,小功能大用处,真没