c#之Lambda表达式

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();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/xj1009420846/article/details/80633990