System.Object 是 .NET 中所有类型的根吗?
System.Object 是 .NET 中所有類型的根嗎?
?
Written by Allen Lee
?
這不是廢話嗎?每個(gè)人一接觸 .NET 就會被提醒任何類型都是直接或者間接繼承自 System.Object 的,即使 MSDN 也記錄著類似的話。事實(shí)果真如此嗎?如果你在命令行界面輸入 ilasm /?,將會發(fā)現(xiàn)這樣一個(gè)參數(shù):
/NOAUTOINHERIT Disable inheriting from System.Object by default
現(xiàn)在,我嘗試?yán)眠@個(gè)參數(shù)做一個(gè)沒有基類的托管類型。首先,打開記事本,寫下如下代碼:
//?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。運(yùn)行一下這個(gè)程序,得到如下輸出:
I have no parents!
當(dāng)然,此時(shí)的 Adam 還不是真正沒有 parent 的。現(xiàn)在,用 ILDASM 打開 Adam.dll,依次選擇 File -> Dump 菜單,點(diǎn)擊 OK,把 IL 代碼另存為 Adam.il。接著,用記事本打開 Adam.il,找到 Adam 的定義,把它后面的 extends [mscorlib]System.Object 注釋掉,保存、退出。然后,在命令行里輸入 ilasm /dll /noautoinherit adam.il,得到新的 Adam.dll。現(xiàn)在,再次運(yùn)行 Program.exe,雖然輸出和之前一樣,但當(dāng)你使用 ILDASM 查看 Adam.dll 里的 Adam 類時(shí),你發(fā)現(xiàn)它已經(jīng)變成“真正的亞當(dāng)”了!就連 Reflector 也說它沒有 Base Types 了,呵呵~~~
然而,我不禁自問,這樣一個(gè)類究竟有什么用呢?如果沒有用處,那么 Microsoft 又為何在 2.0 中引入 /noautoinherit 這樣一個(gè)參數(shù)呢?
轉(zhuǎn)載于:https://www.cnblogs.com/allenlooplee/archive/2007/01/22/627386.html
總結(jié)
以上是生活随笔為你收集整理的System.Object 是 .NET 中所有类型的根吗?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 啥?分布式啥?啥事务?
- 下一篇: asp.net ajax控件工具集 Au