如何在c#中做“内联函数”?我想我不明白这个概念。它们像匿名方法吗?比如函数?
注意:答案几乎完全涉及内联函数的能力,即。用被调用者的主体替换函数调用站点的手册或编译器优化。如果你对匿名(又名lambda)函数感兴趣,请参阅@jalf的回答或每个人都在谈论的“lambda”是什么?
如何在c#中做“内联函数”?我想我不明白这个概念。它们像匿名方法吗?比如函数?
注意:答案几乎完全涉及内联函数的能力,即。用被调用者的主体替换函数调用站点的手册或编译器优化。如果你对匿名(又名lambda)函数感兴趣,请参阅@jalf的回答或每个人都在谈论的“lambda”是什么?
当前回答
我知道这个问题是关于c#的。然而,你可以用f#在。net中编写内联函数。参见:在f#中使用' inline '
其他回答
内联方法只是一种编译器优化,将函数的代码滚入调用方。
在c#中没有这样做的机制,在支持它们的语言中应该谨慎使用它们——如果你不知道为什么应该在某个地方使用它们,那么就不应该使用它们。
编辑:要澄清的是,有两个主要原因需要谨慎使用:
在不必要的情况下使用内联可以很容易地生成大量二进制文件 从性能的角度来看,编译器往往比您更了解什么时候应该内联
最好不去管它,让编译器完成它的工作,然后进行分析并确定内联是否是最适合您的解决方案。当然,有些东西内联是有意义的(特别是数学运算符),但让编译器处理通常是最佳实践。
Lambda表达式是内联函数!我认为,c#没有额外的属性,比如内联或类似的东西!
不,c#中没有这样的构造,但是. net JIT编译器可以决定在JIT时间执行内联函数调用。但我实际上不知道它是否真的在做这样的优化。 (我认为它应该:))
没错,唯一的区别是它返回一个值。
简化(不使用表达式):
列表> < T。ForEach执行一个操作,它不期望返回结果。
所以Action<T>委托就足够了。说:
List<T>.ForEach(param => Console.WriteLine(param));
就等于说:
List<T>.ForEach(delegate(T param) { Console.WriteLine(param); });
不同之处在于参数类型和委托声明是根据用法推断的,在简单的内联方法上不需要花括号。
而
列表> < T。接受一个函数,期待一个结果。
因此,一个Function<T, bool>将被期望:
List<T>.Where(param => param.Value == SomeExpectedComparison);
也就是:
List<T>.Where(delegate(T param) { return param.Value == SomeExpectedComparison; });
你也可以内联声明这些方法,并将它们赋值给变量IE:
Action myAction = () => Console.WriteLine("I'm doing something Nifty!");
myAction();
or
Function<object, string> myFunction = theObject => theObject.ToString();
string myString = myFunction(someObject);
我希望这能有所帮助。
在某些情况下,我确实希望强制代码内联。
For example if I have a complex routine where there are a large number of decisions made within a highly iterative block and those decisions result in similar but slightly differing actions to be carried out. Consider for example, a complex (non DB driven) sort comparer where the sorting algorythm sorts the elements according to a number of different unrelated criteria such as one might do if they were sorting words according to gramatical as well as semantic criteria for a fast language recognition system. I would tend to write helper functions to handle those actions in order to maintain the readability and modularity of the source code.
我知道那些辅助函数应该是内联的,因为这是编写代码的方式,如果它永远不需要被人类理解的话。在这种情况下,我当然希望确保没有函数调用开销。