上海网站建设的价格低,太原网站推广服务,深圳的互联网公司排名,环球影城客户电话虽然闭包主要是函数式编程的玩意儿#xff0c;而C#的最主要特征是面向对象#xff0c;但是利用委托或lambda表达式#xff0c;C#也可以写出具有函数式编程风味的代码。同样的#xff0c;使用委托或者lambda表达式#xff0c;也可以在C#中使用闭包。根据WIKI的定义#xf… 虽然闭包主要是函数式编程的玩意儿而C#的最主要特征是面向对象但是利用委托或lambda表达式C#也可以写出具有函数式编程风味的代码。同样的使用委托或者lambda表达式也可以在C#中使用闭包。根据WIKI的定义闭包又称语法闭包或函数闭包是在函数式编程语言中实现语法绑定的一种技术。闭包在实现上是一个结构体它存储了一个函数通常是其入口地址和一个关联的环境相当于一个符号查找表。闭包也可以延迟变量的生存周期。嗯。。看定义好像有点迷糊让我们看看下面的例子吧这个例子非常简单用lambda表达式创建一个Action对象之后再调用这个Action对象。但是仔细观察会发现当Action对象被调用的时候CreateGreeting方法已经返回了作为它的实参的message应该已经被销毁了那么为什么我们在调用Action对象的时候还是能够得到正确的结果呢原来奥秘就在于这里形成了闭包。虽然CreateGreeting已经返回了但是它的局部变量被返回的lambda表达式所捕获延迟了其生命周期。怎么样这样再回头看闭包定义是不是更清楚了一些闭包就是这么简单其实我们经常都在使用只是有时候我们都不自知而已。比如大家肯定都写过类似下面的代码。这里的代码其实就用了闭包因为我们可以肯定在control被点击的时候这个message早就超过了它的声明周期。合理使用闭包可以确保我们写出在空间和时间上面解耦的委托。不过在使用闭包的时候要注意一个陷阱。因为闭包会延迟局部变量的生命周期在某些情况下程序产生的结果会和预想的不一样。让我们看看下面的例子。这个例子也非常简单创建一个Action链表并依次执行它们。看看结果相信很多人看到这个结果的表情是这样的难道不应该是01234吗出了什么问题刨根问底这儿的问题还是出现在闭包的本质上面作为“闭包延迟了变量的生命周期”这个硬币的另外一面是一个变量可能在不经意间被多个闭包所引用。在这个例子里面局部变量i同时被5个闭包引用这5个闭包共享i所以最后他们打印出来的值是一样的都是i最后退出循环时候的值5。要想解决这个问题也很简单多声明一个局部变量让各个闭包引用自己的局部变量就可以了。 这样各个闭包引用不同的局部变量刚刚的问题就解决了。除此之外还有一个修复的方法在创建闭包的时候使用foreach而不是for。至少在C# 7.0 的版本上面这个问题已经被注意到了使用foreach的时候编译器会自动生成代码绕过这个闭包陷阱。这就是在闭包在C#中的使用和其使用中的一个小陷阱希望大家能通过老胡的文章了解到这个知识点并且在开发中少走弯路