【问题标题】:Will C# inline methods that are declared in interfaces?将在接口中声明的 C# 内联方法吗?
【发布时间】: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 编译器。

标签: c# interface inline


【解决方案1】:

如果您直接调用DoSomething,那么它将成为内联的候选对象(取决于该方法是否满足与大小等相关的其他内联标准)。

如果你通过接口调用DoSomething,那么它不会被内联。接口提供的间接性导致需要 vtable 查找的虚拟调用,因此 JIT 编译器无法内联它,因为实际调用站点仅在运行时解析。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 2023-03-16
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    相关资源
    最近更新 更多