【发布时间】:2015-05-22 02:29:20
【问题描述】:
如果我有接口:
interface IMyInterface
{
void DoSomething();
}
还有一个实现类:
class MyClass : IMyInterface
{
public void DoSomething()
{
}
}
DoSomething 是内联的候选对象吗?我希望“不”,因为如果它是一个接口,那么该对象可能会被转换为 IMyInterface,因此被调用的实际方法是未知的。但是它没有被标记为虚拟的事实意味着它可能不在 vtable 上,所以如果对象被转换为 MyClass,那么它可能会被内联?
【问题讨论】:
-
您的意思是“Microsoft C# 编译器内联方法会调用接口方法吗?”或“Microsoft C# 编译器内联方法会调用实现接口的方法吗?”老实说,最简单的解决方法是编译一些东西并检查 IL。
-
这是一个例子.. 可能对你有用stackoverflow.com/a/4900181/3156647
-
@Aron - 我在问 #2,因为我 99% 确定 #1 的答案是不,它不会内联。此外,内联有时会发生有时不会发生,所以我可能会写一个不内联的示例,但该方法仍可能被归类为可能的内联方法。
-
@tarzanbappa 呃?我不认为他在问 Lambdas。我相信他是在询问编译器优化,即编译器不是在代码中插入函数调用(导致几个间接),而是只是插入函数的代码。
-
@Aron 实际上,C# 编译器永远不会进行内联。执行内联的是 JIT 编译器。