假设我有一个抽象类和一个实现它的类。
public abstract class BaseClass
{
public void Outer()
{
for (int i = 0; i < 1000000; i++)
{
Inner();
}
}
protected abstract void Inner();
}
public class MyClass : BaseClass
{
protected override void Inner()
{
// do stuff
}
}
由于Outer()
调用Inner()
太多并且几乎没有其他作用,因此我希望Inner()
内联使用[MethodImpl(MethodImplOptions.AggressiveInlining)]
。
public abstract class BaseClass
{
public void Outer() // ...
[MethodImpl(MethodImplOptions.AggressiveInlining)]
protected abstract void Inner();
}
public class MyClass : BaseClass
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
protected override void Inner()
{
// do stuff
}
}
此属性是BaseClass
、MyClass
或两者兼而有之,还是在这种情况下该属性根本不有效?
根据Hans的评论,由于抽象类和虚拟调用的性质,抽象成员不能内联。
编辑:根据Ben下面的评论,这通常不适用于所有编译器,但对于JIT也是如此(这恰好是我特定问题的上下文(。