gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:56:38 25 4
gpt4 key购买 nike

当我执行以下代码时,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 中,静态编译时多态性动态 或 < strong>运行时多态性。方法覆盖是动态多态性。静态多态性的一个例子是方法重载。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com