digamos que tenemos siguiente ejemplo de código en C#:¿Por qué compilador de C# método de producción para llamar método BaseClass en IL
class BaseClass
{
public virtual void HelloWorld()
{
Console.WriteLine("Hello Tarik");
}
}
class DerivedClass : BaseClass
{
public override void HelloWorld()
{
base.HelloWorld();
}
}
class Program
{
static void Main(string[] args)
{
DerivedClass derived = new DerivedClass();
derived.HelloWorld();
}
}
Cuando ildasmed el siguiente código:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 15 (0xf)
.maxstack 1
.locals init ([0] class EnumReflection.DerivedClass derived)
IL_0000: nop
IL_0001: newobj instance void EnumReflection.DerivedClass::.ctor()
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: callvirt instance void EnumReflection.BaseClass::HelloWorld()
IL_000d: nop
IL_000e: ret
} // end of method Program::Main
Sin embargo, csc .exe convertido derived.HelloWorld();
->callvirt instance void EnumReflection.BaseClass::HelloWorld()
. ¿Porqué es eso? No mencioné BaseClass en ningún lugar en el método Main
.
Y también si se está llamando BaseClass::HelloWorld()
entonces yo esperaría call
en lugar de callvirt
ya que parece llamada directa a BaseClass::HelloWorld()
método.
Simplemente lanzando esta idea por ahí, pero no sé - esto podría ser una optimización del compilador ya que su método simplemente llama a la implementación base. – payo
@payo no; incluso si la anulación tiene alguna lógica única, el callvirt sería el mismo. – phoog
@phoog esto no es lo mismo para todos los idiomas - Puedo ver cómo este es el caso para C# tho – payo