[C#]在循环中使用lambda表达式时出现下标越界

 问题

        for (int i = 0; i < delegateManager.chooseTexts.Count; i++)
        {
            GameObject choose=Instantiate(choosenPrefab,choosenSet.transform);
            choose.transform.GetChild(0).GetComponent<Text>()                
            .text=delegateManager.chooseTexts[i];
            Debug.Log(delegateManager.chooseMethods[i]);
            choose.GetComponent<Button>().onClick.AddListener(
            ()=>delegateManager.chooseMethods[i]()
            );
            choose.transform.localScale=new Vector3(1,1,1);//防止缩放
        }

上图是我在用委托写动态绑定按钮事件。

然而出现了下标越界的错误。

我直接调用了该委托方法,发现delegateManager.chooseMethods[i]();本身并没有错误,如下图

        for (int i = 0; i < delegateManager.chooseTexts.Count; i++)
        {
            GameObject choose=Instantiate(choosenPrefab,choosenSet.transform);
            choose.transform.GetChild(0).GetComponent<Text>()                
            .text=delegateManager.chooseTexts[i];
            Debug.Log(delegateManager.chooseMethods[i]);
            delegateManager.chooseMethods[i]();//正确执行
            choose.GetComponent<Button>().onClick.AddListener(
            ()=>delegateManager.chooseMethods[i]()
            );
            choose.transform.localScale=new Vector3(1,1,1);//防止缩放
        }

查阅资料后发现lambda表达式用在循环中时,其中的循坏变量,也就是我这里的i一直是循环结束后的i

for(int i=0;i<5;i++)
{
    lambda(()=>Debug.Log(i))//i的值一直为5
}

解决方法

使用一个局部变量来存储i的值

for(int i=0;i<5;i++)
{
    int currentIndex=i;
    lambda(()=>Debug.Log(current))//current为 0 1 2 3 4
}

注意事项

要注意的是 lambda中无法修改外部变量的值 

因为对于局部变量而言,它的生命周期就是所在方法的生命周期。这就决定了count无法被位于同一个栈帧上的lambda修改,因为这种修改毫无意义,你无法将你的修改传递出当前栈帧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值