System.Object 是 .NET 中所有類型的根嗎?

來源:互聯網
上載者:User

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 這樣一個參數呢?

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.