c# 闭包的相关知识以及需要注意的地方

2020-06-20 13:59:46于海丽

相信很多人看到这个结果的表情是这样的!!难道不应该是0,1,2,3,4吗?出了什么问题?

刨根问底,这儿的问题还是出现在闭包的本质上面,作为“闭包延迟了变量的生命周期”这个硬币的另外一面,是一个变量可能在不经意间被多个闭包所引用。

在这个例子里面,局部变量i同时被5个闭包引用,这5个闭包共享i,所以最后他们打印出来的值是一样的,都是i最后退出循环时候的值5。

要想解决这个问题也很简单,多声明一个局部变量,让各个闭包引用自己的局部变量就可以了。

	//其他都保持与之前一致
    static List<Action> CreateActions()
    {
      var result = new List<Action>();
      for (int i = 0; i < 5; i++)
      {
        int temp = i; //添加局部变量
        result.Add(() => Console.WriteLine(temp));
      }
      return result;
    }

这样各个闭包引用不同的局部变量,刚刚的问题就解决了。

除此之外,还有一个修复的方法,在创建闭包的时候,使用foreach而不是for。至少在C# 7.0 的版本上面,这个问题已经被注意到了,使用foreach的时候编译器会自动生成代码绕过这个闭包陷阱。

	//这样fix也是可以的
    static List<Action> CreateActions()
    {
      var result = new List<Action>();
      foreach (var i in Enumerable.Range(0,5))
      {
        result.Add(() => Console.WriteLine(i));
      }
      return result;
    }

这就是在闭包在C#中的使用和其使用中的一个小陷阱,希望大家能通过老胡的文章了解到这个知识点并且在开发中少走弯路!

以上就是c# 闭包的相关知识以及需要注意的地方的详细内容,更多关于c# 闭包的资料请关注易采站长站其它相关文章!