C#中的匿名方法是在C#2.0引入的,它终结了C#2.0之前版本声明委托的唯一方法是使用命名方法的时代。虽然在 C# 3.0 及更高版本中,Lambda 表达式取代了匿名方法,作为编写内联代码的首选方式。但是,匿名方法的信息同样也适用于 Lambda 表达式,可以说 Lambda 表达式就是匿名方法演变过来的,这点后续博文会讲解推演的过程。 我们可以使用匿名方法来忽略参数列表。 这意味着匿名方法可转换为具有各种签名的委托,而这对于 Lambda 表达式来说是不可能的。 学好匿名方法,才能更加深刻地理解好 Lambda 表达式。
在说匿名方法的使用之前,先来说说匿名方法的其他叫法。匿名方法也有人叫匿名委托、匿名函数,虽然现在普遍通用,但是还是有点区别的。msdn官网上说:要将代码块传递为委托参数,创建匿名方法则是唯一的方法。这里的匿名方法就是官方的说法,而因为匿名方法就是为了将代码块传递为委托参数,因此也有人叫匿名委托,包括笔者也喜欢这种称呼,我觉得这样叫通俗易懂。至于匿名函数,因为C#中“方法”(Method)的概念有些语言叫“函数”(Function),因此匿名方法也被人叫做匿名函数。然而在msdn文档介绍中匿名函数包括了Lambda 表达式和匿名方法,可以说匿名函数是更高的一级,所以说最官方的叫法还是匿名方法,当然其他的叫法流传也甚广,听得懂就行了,没必要纠结。
接下来说说匿名方法的写法规则,先上例子:
delegate(int i) { return i > 0; }
它遵循这样的格式书写:delegate(形参表){方法体代码},可以类比js中匿名函数的写法来记忆。
那么匿名方法运用在哪里呢?怎么使用呢?当你需要一个临时方法,该方法使用次数极少或者你需要的这个方法的代码很简短,那么你就可以使用匿名方法。给个简单的例子,如果需要在一个整型集合中筛选出符合条件的新集合,如下
List<int> list = new List<int>() { 1, 2, 3, 4, 5, 6 }; //假设需要从list集合中获取大于3的所有元素以新集合返回 var newlist = newlist.FindAll(GetNewList);
GetNewList()为另外定义的和委托Predicate<T>具有同签名的方法(Predicate<T>是系统内置委托,后续博文会讲)
GetNewList()定义如下:
bool GetNewList(int i) { return i > 3; }
以上是没有使用匿名方法时的写法,如果使用了匿名方法,你就会发现一切变得如此简便,
List<int> list = new List<int>() { 1, 2, 3, 4, 5, 6 }; var newlist = list.FindAll(delegate(int i) { return i > 3; });
通过对比,可以发现使用匿名方法能够提供与先前命名方法相同的功能,但是它已经不再需要一个在关联到委托之前就明确创建的方法了,因此也减少了实例化委托所需的编码系统开销,这就是它的最大好处。