C#中的内联函数?

你如何做C#中的“内联函数”? 我不认为我理解这个概念。 他们喜欢匿名方法吗? 像lambda函数一样?

注意 :答案几乎完全处理内联函数的能力,即“手动或编译器优化,用被调用者的主体替换函数调用站点”。 如果您对匿名(aka lambda)函数感兴趣,请参阅@ jalf的答案或每个人都在说的“Lambda”是什么?


最后在.NET 4.5中,CLR允许使用MethodImplOptions.AggressiveInlining值提示/建议1方法内联。 它也可以在Mono的行李箱中使用(今天承诺)。

// The full attribute usage is in mscorlib.dll,
// so should not need to include extra references
using System.Runtime.CompilerServices; 

...

[MethodImpl(MethodImplOptions.AggressiveInlining)]
void MyMethod(...)

1 。 此前使用“武力”。 由于有一些降薪,我会尽力澄清这个词。 如评论和文档中所述, The method should be inlined if possible.The method should be inlined if possible. 特别是考虑单声道(开放式),考虑内联或更普遍的技术限制(如虚拟功能),存在一些单一特定的技术限制。 总体而言,是的,这是编译器的一个暗示,但我想这就是要求的。


内联方法只是一个编译器优化,其中一个函数的代码被放入调用方。

在C#中没有这样做的机制,并且它们将被谨慎地用在支持它们的语言中 - 如果你不知道为什么它们应该用在某个地方,那它们就不应该是这样。

编辑:澄清,他们需要谨慎使用有两个主要原因:

  • 在没有必要的情况下通过使用内联来制作大规模的二进制文件很容易
  • 从性能的角度来看,编译器倾向于比内存中的内容更好
  • 最好让事情独立并让编译器完成工作,然后进行配置并确定内联是否是最适合您的解决方案。 当然,有些内容是有意义的(特别是数学运算符),但让编译器处理它通常是最佳实践。


    更新:根据konrad.kruczynski的回答,以下版本的.NET版本高达并包括4.0版本。

    您可以使用MethodImplAttribute类防止方法被内联...

    [MethodImpl(MethodImplOptions.NoInlining)]
    void SomeMethod()
    {
        // ...
    }
    

    ......但是没有办法做相反的事情,并强迫它被内联。

    链接地址: http://www.djcxy.com/p/64041.html

    上一篇: Inline functions in C#?

    下一篇: Does restrict help in C if a pointer is already marked const?