前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >随便聊聊Lambda

随便聊聊Lambda

作者头像
用户2615200
发布2018-08-02 16:40:13
3040
发布2018-08-02 16:40:13
举报

C#用多了,对于Lambda肯定不陌生,作为创建委托的一种简易方式,使用上确实相当顺手,不过用的多了,难免也会踩坑,下面这个坑可能就有不少朋友踩过:

代码语言:javascript
复制
var count = 8;
var Func = new List<Action>(count);

for (int i = 0; i < count; ++i)
{
    Func.Add(() => { Console.WriteLine(i); });
}

foreach (var action in Func)
{
    action();
}

代码很简单,使用List缓存了一些委托然后执行,那么执行的结果是什么呢?一些朋友可能会脱口而出: 0 1 2 3 4 5 6 7 可惜正确答案却是: 8 8 8 8 8 8 8 8 ! 原因在于Lambda表达式中捕获的i是同一个引用变量!

代码改成这样也许会更清晰一些(这里i被写在了循环外):

代码语言:javascript
复制
var count = 8;
var Func = new List<Action>(count);

int i = 0;
for (i = 0; i < count; ++i)
{
    Func.Add(() => { Console.WriteLine(i); });
}

foreach (var action in Func)
{
    action();
}

为了避免这个问题,我们需要创建不同的局部变量(这里我们通过创建多份index来缓存中间数值):

代码语言:javascript
复制
var count = 8;
var Func = new List<Action>(count);

for (int i = 0; i < count; ++i)
{
    int index = i;
    Func.Add(() => { Console.WriteLine(index); });
}

foreach (var action in Func)
{
    action();
}

实际上这个坑在C#5之后就被填上了,只是现实来看,你可能还没法用上C#5(例如Unity目前仍不支持),所以在平时使用Lambda时还是要多留下心~

OK,闲聊结束,下次再见吧~

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年09月11日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档