【发布时间】:2016-03-20 09:31:05
【问题描述】:
假设我们有这个类:
// Provides deferred behaviour
public class Command<TResult>
{
private Func<object[], TResult> _executeFunction;
private object[] _args;
public Command(Func<object[], TResult> execution, params object[] arguments)
{
_executeFunction = execution;
_args = arguments;
}
public TResult Execute()
{
return _executeFunction(_args);
}
}
这两个匿名函数有什么区别?
int a = 1;
int b = 4;
// a and b are passed in as arguments to the function
Command<int> sum = new Command<int>(args => (int)args[0] + (int)args[1], a, b);
// a and b are captured by the function
Command<int> sum2 = new Command<int>(_ => a + b);
Console.WriteLine(sum.Execute()); //Prints out 5
Console.WriteLine(sum2.Execute()); //Prints out 5
我专门寻找性能差异。
此外,我们知道,如果某个类持有 sum2 的引用,那么 a 和 b 将超出它们定义的范围,如果函数仍然存在,可能永远不会被 GC 收集在任何地方引用。
sum 也会发生同样的情况吗? (考虑到参数是引用类型,而不是本例中的值类型)
【问题讨论】:
标签: c# .net lambda closures anonymous-function