首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 到 IL 深度解析:第4章 關鍵字與操作符 (上)(13) - override、new 與虛擬方法分派

     編輯:關於C語言

override 與 new 的 IL 體現

  • override:方法標記為 virtual,移除 newslot,實現真正覆寫。
  • new:方法不標記 virtual,隱藏基類同名方法,編譯期依靜態類型繫結。

範例:override 覆寫基類虛擬方法

// C# 代碼
class yyy {
    public virtual void abc() { Console.WriteLine("yyy abc"); }
}
class xxx : yyy {
    public override void abc() {
        base.abc();
        Console.WriteLine("xxx abc");
    }
}

IL 關鍵點:

  • 基類 yyy.abc 標記 newslot virtual。
  • 派生類 xxx.abc 標記 virtual(無 newslot)。
  • base.abc() 編譯為 call instance void yyy::abc()(非虛呼叫)。
  • 入口點以 callvirt instance void yyy::abc() 呼叫,運行時分派至 xxx.abc。
.method public hidebysig virtual instance void abc() il managed {
    ldarg.0
    call instance void yyy::abc()   // base.abc()
    ldstr "xxx abc"
    call void [mscorlib]System.Console::WriteLine(string)
    ret
}

輸出:yyy abc、xxx abc。

call vs callvirt

  • call:靜態繫結,指定方法直接呼叫。
  • callvirt:動態分派,依物件實際類型查找虛擬方法表。

這展示了多型在 IL 層級的核心機制。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved