如果我有一个界面:
interface IMyInterface
{
void DoSomething();
}
实施班:
class MyClass : IMyInterface
{
public void DoSomething()
{
}
}
DoSomething是内联的候选人吗?我期望“不”,因为如果它是一个接口,那么该对象可以被转换为IMyInterface,因此被调用的实际方法是未知的。但是事实上它没有标记为虚拟意味着它可能不在vtable上,所以如果对象被转换为MyClass,那么也许它可以被内联?
答案 0 :(得分:4)
如果您直接致电DoSomething
,那么它将成为内联的候选者(取决于该方法是否符合与大小等相关的其他内联标准)。
如果您通过界面调用DoSomething
,则不会内联。接口提供的间接导致需要vtable查找的虚拟调用,因此JIT编译器无法内联它,因为实际的调用点仅在运行时解析。