c# in deep 之使用匿名方法的内联委托操作
匿名方法允许我们指定一个内联委托的操作,为创建委托实例表达式的一部分。其可以对代码进行极度精简,当然可读性变得很差。下面看一个求平方根的例子。
List<int> list = new List<int>();
list.Add(4);
list.Add(5);
list.Add(15);
list.Add(20);
list.Add(49);
list.ForEach(delegate(int x) { Console.WriteLine(Math.Sqrt(x)); });
乍眼一看,会发现其没有什么可读性。若既想精简,又要保持可读性怎么办呢,我们可以取一个折中的办法,即不再坚持“大括号单独占一行”的规则,但仍要保留足够的空白。比如上例可以写成下面的格式:
List<int> list = new List<int>();
list.Add(4);
list.Add(5);
list.Add(15);
list.Add(20);
list.Add(49);
list.ForEach(delegate(int x) {
Console.WriteLine(Math.Sqrt(x));
});
这样会使层次感更加清晰。下例展示了一个有返回值匿名方法的实例:
Predicate<int> isEven = delegate(int x) { return x % 2 == 0; };
Console.WriteLine(isEven(1));
Console.WriteLine(isEven(4));
这是一个判断整数是奇数还是偶数的例子。我们把匿名方法当做一个普通的方法来对待,并返回一个恰当的值。我们不需要在靠近参数类型的地方声明一个返回类型,编译器会尝试将匿名方法转换成委托类型,它只需检查是否所有可能的返回值都兼容于这个类型声明的返回类型。