如何在c#中做“内联函数”?我想我不明白这个概念。它们像匿名方法吗?比如函数?
注意:答案几乎完全涉及内联函数的能力,即。用被调用者的主体替换函数调用站点的手册或编译器优化。如果你对匿名(又名lambda)函数感兴趣,请参阅@jalf的回答或每个人都在谈论的“lambda”是什么?
如何在c#中做“内联函数”?我想我不明白这个概念。它们像匿名方法吗?比如函数?
注意:答案几乎完全涉及内联函数的能力,即。用被调用者的主体替换函数调用站点的手册或编译器优化。如果你对匿名(又名lambda)函数感兴趣,请参阅@jalf的回答或每个人都在谈论的“lambda”是什么?
当前回答
你是指c++意义上的内联函数吗?其中一个正常函数的内容被自动内联复制到callsite?最终的结果是,在调用函数时实际上不会发生函数调用。
例子:
inline int Add(int left, int right) { return left + right; }
如果是,那么没有,c#中没有与之等价的东西。
或者你是指在另一个函数中声明的函数吗?如果是的话,c#通过匿名方法或lambda表达式来支持。
例子:
static void Example() {
Func<int,int,int> add = (x,y) => x + y;
var result = add(4,6); // 10
}
其他回答
内联方法只是一种编译器优化,将函数的代码滚入调用方。
在c#中没有这样做的机制,在支持它们的语言中应该谨慎使用它们——如果你不知道为什么应该在某个地方使用它们,那么就不应该使用它们。
编辑:要澄清的是,有两个主要原因需要谨慎使用:
在不必要的情况下使用内联可以很容易地生成大量二进制文件 从性能的角度来看,编译器往往比您更了解什么时候应该内联
最好不去管它,让编译器完成它的工作,然后进行分析并确定内联是否是最适合您的解决方案。当然,有些东西内联是有意义的(特别是数学运算符),但让编译器处理通常是最佳实践。
你是指c++意义上的内联函数吗?其中一个正常函数的内容被自动内联复制到callsite?最终的结果是,在调用函数时实际上不会发生函数调用。
例子:
inline int Add(int left, int right) { return left + right; }
如果是,那么没有,c#中没有与之等价的东西。
或者你是指在另一个函数中声明的函数吗?如果是的话,c#通过匿名方法或lambda表达式来支持。
例子:
static void Example() {
Func<int,int,int> add = (x,y) => x + y;
var result = add(4,6); // 10
}
如果您的程序集将被ngen-ed,您可能想要查看TargetedPatchingOptOut。这将帮助ngen决定是否内联方法。MSDN参考
这仍然只是一个声明性的优化提示,而不是命令式命令。
Lambda表达式是内联函数!我认为,c#没有额外的属性,比如内联或类似的东西!
不,c#中没有这样的构造,但是. net JIT编译器可以决定在JIT时间执行内联函数调用。但我实际上不知道它是否真的在做这样的优化。 (我认为它应该:))