如何在c#中做“内联函数”?我想我不明白这个概念。它们像匿名方法吗?比如函数?
注意:答案几乎完全涉及内联函数的能力,即。用被调用者的主体替换函数调用站点的手册或编译器优化。如果你对匿名(又名lambda)函数感兴趣,请参阅@jalf的回答或每个人都在谈论的“lambda”是什么?
如何在c#中做“内联函数”?我想我不明白这个概念。它们像匿名方法吗?比如函数?
注意:答案几乎完全涉及内联函数的能力,即。用被调用者的主体替换函数调用站点的手册或编译器优化。如果你对匿名(又名lambda)函数感兴趣,请参阅@jalf的回答或每个人都在谈论的“lambda”是什么?
当前回答
如果您的程序集将被ngen-ed,您可能想要查看TargetedPatchingOptOut。这将帮助ngen决定是否内联方法。MSDN参考
这仍然只是一个声明性的优化提示,而不是命令式命令。
其他回答
你是指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
}
更新:根据konrad.kruczynski的回答,以下情况适用于。net 4.0及以下版本。
你可以使用MethodImplAttribute类来防止一个方法被内联…
[MethodImpl(MethodImplOptions.NoInlining)]
void SomeMethod()
{
// ...
}
...但是没有办法做相反的事情,强迫它内联。
Cody说得对,但我想提供一个内联函数是什么的例子。
假设你有这样的代码:
private void OutputItem(string x)
{
Console.WriteLine(x);
//maybe encapsulate additional logic to decide
// whether to also write the message to Trace or a log file
}
public IList<string> BuildListAndOutput(IEnumerable<string> x)
{ // let's pretend IEnumerable<T>.ToList() doesn't exist for the moment
IList<string> result = new List<string>();
foreach(string y in x)
{
result.Add(y);
OutputItem(y);
}
return result;
}
编译器即时优化器可以选择修改代码,以避免在堆栈上重复调用OutputItem(),这样就好像你写的代码是这样的:
public IList<string> BuildListAndOutput(IEnumerable<string> x)
{
IList<string> result = new List<string>();
foreach(string y in x)
{
result.Add(y);
// full OutputItem() implementation is placed here
Console.WriteLine(y);
}
return result;
}
在本例中,我们可以说OutputItem()函数是内联的。注意,即使从其他地方也调用OutputItem(),它也可能这样做。
经过编辑以显示更可能内联的场景。
没错,唯一的区别是它返回一个值。
简化(不使用表达式):
列表> < 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);
我希望这能有所帮助。
Lambda表达式是内联函数!我认为,c#没有额外的属性,比如内联或类似的东西!