C#中的匿名函数和闭包

来源:互联网 发布:泉州专业淘宝拍摄 编辑:程序博客网 时间:2024/04/29 13:11

C# 支持用于调用一个或多个方法的委托 (delegate)。委托提供运算符和方法来添加或删除目标方法,它也可以在整个 .NET 框架中广泛地用于事件、回调、异步调用、多线程等。匿名函数其实从简单的介绍的话,是没有名字的函数,更严格一些,匿名函数是闭包的一个实现,也就是C#通过兰步达表达式(匿名函数)实现了闭包,通过闭包,可以改变局部变量的声明周期,因此闭包有很多很特殊和奇妙的引用。

闭包的概念:主要是指由函数以及与函数相关的上下文环境组成的实体,通过闭包,函数与上下文变量之间建立起关联关系,上下文变量的状态可以在函数的多次调用过程中持久保持,从作用域的角度而言,私有变量的生存期被延长,函数调用所生成的值在下次调用时仍被保持。从安全性的角度而言,闭包有利于信息隐蔽,私有变量只在该函数内可见。

形成闭包的条件:嵌套定义的函数、匿名函数、将函数作为参数或者返回值。


常规委托:

class SomeClass{   delegate void SomeDelegate();   public void InvokeMethod()   {      SomeDelegate del = new SomeDelegate(SomeMethod);            del();    }   void SomeMethod()      {            MessageBox.Show("Hello");   }}
可以用一个匿名方法来定义和实现这个方法:
class SomeClass{   delegate void SomeDelegate();   public void InvokeMethod()   {      SomeDelegate del = delegate()                          {                             MessageBox.Show("Hello");                         };      del();      }}
=============================================================class SomeClass{   delegate void SomeDelegate();   public void SomeMethod()      {            InvokeDelegate(delegate(){MessageBox.Show("Hello");});      }      void InvokeDelegate(SomeDelegate del)      {            del();      }}将参数传递到匿名方法:
class SomeClass{   delegate void SomeDelegate(string str);   public void InvokeMethod()   {      SomeDelegate del = delegate(string str)                         {                             MessageBox.Show(str);                         };      del("Hello");      }} 一般的匿名方法:class SomeClass<T>{      delegate void SomeDelegate(T t);      public void InvokeMethod(T t)      {            SomeDelegate del = delegate(T item){...}          del(t);      }}注意点:1.如果匿名方法没有参数,则可以在 delegate 关键字后面使用一对空括号:class SomeClass{delegate void SomeDelegate();public void InvokeMethod(){SomeDelegate del = delegate(){MessageBox.Show("Hello");};del();}}2.如果您将 delegate 关键字与后面的空括号一起忽略,则您将定义一种特殊的匿名方法,它可以指派给具有任何签名的任何委托:class SomeClass{   delegate void SomeDelegate(string str);   public void InvokeMethod()   {      SomeDelegate del = delegate                                                  {                             MessageBox.Show("Hello");                         };      del("Parameter is ignored");      }}
                                             
0 0