c# - 使用多态性时重载方法的 ILDASM 代码

标签 c# polymorphism overriding

当我执行以下代码时,ILDASM 中将显示以下内容。我的疑问是,即使子类方法将被执行,为什么 ILDASM 显示调用了 Baseclass 方法。是因为实例是BaseClass类型吗?如果这是基类如何访问子类方法的原因?

 class BaseClass
    {
        public virtual void Mover(long a,long b)
        {
           Console.WriteLine(a*b+"LongBaseClass");
        }
    }
class ChildClass : BaseClass
{
    public override void Mover(long a, long b)
    {
        Console.WriteLine(a+b+"LongChildClass");
    }
    public static void Main(string[] args)
    {
       long a=10,b=20;
       BaseClass bcc=new ChildClass();
       bcc.Mover(a,b);
}
callvirt instance void practiceonly.BaseClass::Mover(int64, int64)

最佳答案

[E]ven though the child class method will be executed why is ILDASM showing that the Baseclass method is called?

因为 ILDASM 显示了代码在编译时的样子,并且方法重写在运行时得到解决。无论您是否打电话

BaseClass baseClass = new ChildClass();
baseClass.Mover(42, 42); // Yields 1764LongBaseClass

ChildClass childClass = new ChildClass();
childClass.Mover(42, 42); // Yields 1764LongChildClass

两者都将翻译为

callvirt instance void BaseClass::Mover(int64, int64)

这是因为编译器不知道重写的方法是否存在以及您是否打算调用它。

实际调用的方法是在运行时根据引用所引用的对象确定的(在后一个代码示例中,引用的类型为 ChildClass ,而在第一个代码示例中,它的类型为基类)。


在 .NET 中,静态编译时多态性动态或<运行时多态性。方法重写是动态多态性。静态多态性的一个例子是方法重载。

关于c# - 使用多态性时重载方法的 ILDASM 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54284114/

相关文章:

c# - 按 Enter 键时调用按钮单击事件 - c#

c# - 在 Azure 计算 UI 中,为什么 Trace.WriteLine 不转到辅助角色的控制台窗口? 2.2 软件开发工具包

c# - 如何发布Windows应用程序并且只获取.exe文件?

c# - 我可以防止继承的虚方法在子类中被覆盖吗?

C#:派生类上具有不同返回类型的属性

C#给字符串变量添加函数或变量的方法

c# - 如何在 C# 中格式化美分和美元?如何将一个转换为另一个?

Scala Play框架2.1派生类

java - 为什么我可以编译出错误的代码?

c++ - 在构造函数中调用虚函数