Мне интересно, как оптимизируется следующий код. В частности, касается виртуальных и прямых вызовов. Я прокомментировал, как я думаю, что все оптимизировано, но это просто догадки.Как компилятор оптимизирует виртуальные методы, реализованные с помощью закрытого класса
public abstract class Super
{
public abstract void Foo();
public void FooUser()
{
Foo();
}
}
public class Child1 : Super
{
public override void Foo()
{
//doSomething
}
}
public class SealedChild : Super
{
public override void Foo()
{
//doSomething
}
}
class Program
{
void main()
{
Child1 child1 = new Child1();
child1.Foo(); //Virtual call?
child1.FooUser(); //Direct call and then a virtual call.
SealedChild sealedChild = new SealedChild();
sealedChild.Foo(); //Direct call?
sealedChild.FooUser();
/* Two options: either a direct call & then a virtual call
* Or: direct call with a parameter that has a function pointer to Foo, and then a direct call to foo.
*/
Super super = child1;
super.Foo(); //Virtual call.
super.FooUser(); //Virtual call then direct call.
}
}
Ваш «SealedClass» на самом деле не определен как запечатанный. Так что это ничем не отличается от вашего класса Child1. –
C#? Это поможет узнать. –