Lambda表达式。
例如,我定义一个委托:
delegate int Method(int a, int b);
再定义一个方法:
int Add(int a, int b)
{
return a + b;
}
我可能需要这样通过委托调用方法:
Method m += Add;
Console.WriteLine(m(2, 3));
====================================================
但如果用 Lambda 表达式:
Method m += (a ,b) => a + b;
Console.WriteLine(m(2, 3));
可以省去方法的定义。
实际上, Lambda 表达式只是简化了匿名方法的语法而已。
但是要注意:
public class test : MonoBehaviour { private delegate void MyDelegate(); void Start() { int testNumber = 5; List<MyDelegate> testList = new List<MyDelegate>(); for (int i = 0; i < testNumber; i++) { testList.Add(() => { Debug.Log(i); }); } for (int i = 0; i < testNumber; i++) { testList[i].Invoke(); } } }
运行结果:
百度没查到原因,但是看了
果壳中的C# 5.0权威指南,这本书里面有解释。
原因是:Lambda表达式引用的外部变量成为捕获变量,捕获变量的表达式成为一个闭包。捕获变量的生命周期延长到和委托的生命周期相同。当捕获for或者foreach的循环变量,c#把这些当做循环外部的。所以输入的永远是最后一个值。
解决办法:添加临时变量传递参数
public class test : MonoBehaviour { private delegate void MyDelegate(); void Start() { int testNumber = 5; List<MyDelegate> testList = new List<MyDelegate>(); for (int i = 0; i < testNumber; i++) { int a = i; testList.Add(() => { Debug.Log(a); }); } for (int i = 0; i < testNumber; i++) { testList[i].Invoke(); } } }