C#3.0新亮点
C#2.0之前, 如果一个方法或者变量需要使用委托(delegate)时, 则之前必须创建一个命名方法, 并在需要委托的位置传入这个名称. 比如有一个针对int类型的数据处理, 目的是筛选出一个int数组中为奇数的元素, 或者其它一些满足条件的元素,代码如下:
public class Commom { //命名一个委托方法 public delegate bool IntFilter(int i); //筛选出符合委托方法所要求的int, 返回一个int[] public static int[] FilterArrayOfInts(int[] ints, IntFilter filter) { ArrayList aList = new ArrayList(); foreach (int i in ints) if (filter(i)) aList.Add(i); return (int[])aList.ToArray(typeof(int)); } }
Commom类建立了一个统一的模型, 这个模型主要用于传入一个delegate方法, 可以获得这个delegate方法条件所要求的数字. 具体这个delegate方法可以写在另一个类中, 可以写很多方法, 检测是否是奇数, 是否是偶数, 这个数是否是3的倍数...这个根据需要自己写. 这样写可以提高Commom类的可重用程度,代码如下:
//根据需要, 自己定义筛选方法 public class MyIntFilter { //自己定义的筛选方法1: 检测是否是奇数 public static bool IsOdd(int i) { return ((i & 1) == 1); } //自己定义的筛选方法2: 检测是否是偶数 public static bool IsEven(int i) { return ((i & 1) != 1); } //...根据需要还可以定义其它筛选方法 }
调用MyIntFilter中的筛选方法,代码如下:
int[] nums = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; //筛选出奇数 int[] oddNums = Commom.FilterArrayOfInts(nums, MyIntFilter.IsOdd); //筛选出偶数 int[] evenNums = Commom.FilterArrayOfInts(nums, MyIntFilter.IsEven); //测试结果, 打印出oddNums和evenNums Console.WriteLine("Print oddNums:"); foreach (int i in oddNums) Console.Write(i + " "); Console.WriteLine("Print evenNums:"); foreach (int i in evenNums) Console.Write(i + " ");
为什么要使用匿名方法? 当然是为了偷懒. 为每一个筛选策略专门写一个方法很多时候会令人很烦, 很多方法可能只被用到一次两次, 且为每个方法都起一个好听的名字并在调用这些方法的时候传入这些方法名令人不爽, 因此C#2.0的时候可以使用"匿名方法"解决这一问题,代码如下:
int[] nums = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; //筛选出奇数 int[] oddNums = Commom.FilterArrayOfInts(nums, delegate(int i) { return ((i & 1) == 1); }); Console.WriteLine("Print oddNums:"); foreach (int i in oddNums) Console.Write(i + " ");