C# 经常遇到的闭包问题

闭包概念

内层的函数可以引用包含在它外层的函数变量,即使外层函数的执行已经终止。但,该变量的值并非变量创建时的值,而是在外层函数内的最终值。

使用场景

闭包主要使用在访问外层函数定义的变量上。由于C#中有委托和lambda函数,所以C#可以在方法体内嵌套委托或lambda表达式,此时就形成了闭包,闭包可以帮助我们轻松地访问外层函数定义的变量。

以下是闭包(嵌套)代码:

void CloserMothed(int v1)
{
    void CloserMothedChild(int v2)
    {
        int endValue = v1 + v2;
    }
}

错误使用后存在坑的情况:

 

public class Closer : MonoBehaviour
{
    public List<Button> btns;
    void Start()
    {
        for (int i = 0; i < btns.Count; i++)
        {
            btns[i].onClick.AddListener(() => { 
                OnClick(i);//i始终是btns.Count
            });
        }
    }

    void OnClick(int index)
    {
        print(index);
    }
}

// 输出:
// btns.Count
// btns.Count
// btns.Count

修正后:

 

public class Closer : MonoBehaviour
{
    public List<Button> btns;
    
    void Start()
    {
        for (int i = 0; i < btns.Count; i++)
        {
            int index = i;//用一个变量来接收i,这样内函数使用index就是我们想要的结果了。
           btns[i].onClick.AddListener(() => { OnClick(index);});
        }
    }
    
    void OnClick(int index)
    {
        print(index);
    }
}
// 输出:
// 1
// 2
// 3
// 。。。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值