如何在c#中做“内联函数”?我想我不明白这个概念。它们像匿名方法吗?比如函数?
注意:答案几乎完全涉及内联函数的能力,即。用被调用者的主体替换函数调用站点的手册或编译器优化。如果你对匿名(又名lambda)函数感兴趣,请参阅@jalf的回答或每个人都在谈论的“lambda”是什么?
如何在c#中做“内联函数”?我想我不明白这个概念。它们像匿名方法吗?比如函数?
注意:答案几乎完全涉及内联函数的能力,即。用被调用者的主体替换函数调用站点的手册或编译器优化。如果你对匿名(又名lambda)函数感兴趣,请参阅@jalf的回答或每个人都在谈论的“lambda”是什么?
当前回答
我知道这个问题是关于c#的。然而,你可以用f#在。net中编写内联函数。参见:在f#中使用' inline '
其他回答
我知道这个问题是关于c#的。然而,你可以用f#在。net中编写内联函数。参见:在f#中使用' inline '
内联方法只是一种编译器优化,将函数的代码滚入调用方。
在c#中没有这样做的机制,在支持它们的语言中应该谨慎使用它们——如果你不知道为什么应该在某个地方使用它们,那么就不应该使用它们。
编辑:要澄清的是,有两个主要原因需要谨慎使用:
在不必要的情况下使用内联可以很容易地生成大量二进制文件 从性能的角度来看,编译器往往比您更了解什么时候应该内联
最好不去管它,让编译器完成它的工作,然后进行分析并确定内联是否是最适合您的解决方案。当然,有些东西内联是有意义的(特别是数学运算符),但让编译器处理通常是最佳实践。
Lambda表达式是内联函数!我认为,c#没有额外的属性,比如内联或类似的东西!
你把两个不同的概念混在一起了。函数内联是对语义没有影响的编译器优化。不管函数是否内联,它的行为都是一样的。
另一方面,lambda函数纯粹是一个语义概念。对于它们应该如何实现或执行没有要求,只要它们遵循语言规范中规定的行为即可。如果JIT编译器喜欢,它们可以内联,如果不喜欢,则不可以。
c#中没有内联关键字,因为这是一种通常可以留给编译器的优化,尤其是在JIT语言中。JIT编译器可以访问运行时统计信息,这使它能够比编写代码时更有效地决定内联哪些内容。函数将内联,如果编译器决定,没有什么你可以做的任何方式。:)
如果您的程序集将被ngen-ed,您可能想要查看TargetedPatchingOptOut。这将帮助ngen决定是否内联方法。MSDN参考
这仍然只是一个声明性的优化提示,而不是命令式命令。