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"); } }