C# 對象的建立過程

來源:互聯網
上載者:User

先看代碼:

namespace Temp{    class Program    {        static void Main(string[] args)        {            Class1 c = new Class1();        }    }    class BaseClass    {        int z = 3;        public BaseClass()        {            MethodA();        }        public virtual void MethodA()        {            Console.WriteLine("BaseClass.MethodA");        }    }    class Class1 : BaseClass    {        int x = 1;        int y;        public Class1()        {            y = 2;        }        public override void MethodA()        {            Console.WriteLine(x + y);        }    }}

以上是一個簡單的繼承階層。不要使用 VS 測試,腦子分析一下最終輸出了什嗎?

分析過程中腦子存在任何疑問的同學,請馬上動手測試一下吧,在 Main 方法中設個斷點單步跟蹤一下。

這裡描述一下單步調試的整個過程:

  1. 黃色游標進入 Class1 類時跳入了第一句 int x = 1;
  2. 黃色游標跳過第二句 int y 指向 Class1 的建構函式;
  3. 在執行建構函式的代碼塊之前跳入了父類,黃色游標指向父類 BaseClass 的 int z = 3 語句;
  4. 黃色游標指向 BaseClass 的建構函式;
  5. 黃色游標指向建構函式內的 MethodA() 調用;
  6. 黃色游標跳向子類 Class1 重寫的方法 MethodA();
  7. 查看兩個欄位發現 x=1, y=0;
  8. 黃色游標指向 Console 語句;
  9. 黃色游標從父類建構函式的 MethodA() 調用中跳出;
  10. 黃色游標從父類建構函式跳出,並再次指向子類建構函式,執行完其中的代碼塊;
  11. 直至執行完畢。

 

這裡說明了幾個順序問題:

  1. 對於直接賦值的欄位的賦值步驟是在建構函式之前執行,子類欄位的賦值是在父類的欄位賦值之前;
  2. 對於欄位的記憶體配置、初始化等步驟是在我們所能看到的黃色游標進入 Class1 類的步驟之前;
  3. 執行建構函式前會首先執行父類的建構函式;
  4. 執行建構函式時 CLR 已能識別方法的覆寫情況,表明方法的載入過程是在對欄位的賦值步驟之前;
  5. int 類型的欄位在分配記憶體、初始化階段已預設賦了 0 值(僅限欄位中的 int,方法中的int變數並非如此)。

總結:當執行 new 語句時,發生了以下幾件事情(更細的情形本文暫不探討):

  1. 為欄位分配記憶體並進行初始化;
  2. 如果類是第一次載入(即系統中從未建立類的其它對象,或者曾經建立但因不再有引用而被 GC 全部回收),則 Copy 其執行個體方法至方法表;
  3. 為類中需要直接賦值的欄位賦值;
  4. 執行建構函式。

這裡只分析了欄位類型為 int 的情形,歡迎大家自己探索 string 或其它參考型別的情形。歡迎多多指教。

PS: 請教一下,VS中單步調試時的黃色游標有沒有專用術語?

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.