摘要:我们都知道.NET Framework 2.0支持了泛型,在它给我们带来性能收益和强类型的方便的同时,由于接口、委托等元素对泛型的支持,一些前所未有的泛型设计和算法也逐渐展现出来。
C# 2.0支持了一种叫“匿名方法”的特性,它与泛型委托结合之后,能够产生出许多诱人的新用法。比如,若想找出列表中所有大于10的元素,只需要:List<int> l1 = new List<int>();
//populate l1
List<int> l2 = l1.FindAll(delegate(int i)...{ return i > 10; });
对于首次接触这个新特性的人来说,此语法较为费解。我们看看Generic List类的FindAll方法的定义:public List<T> FindAll(
Predicate<T> match
);
我们看到,唯一的参数match是“Predicate<T>”类型的,那Predicate<T>又是什么呢,请看定义:public delegate bool Predicate<T>(
T obj
);
这是一个委托,接受T类型的一个参数obj,并返回一个布尔类型,表示对obj的一个判断。现在我们就明白了,FindAll方法本应接受一个函数委托作为参数,以表示查找满足判断的所有元素,而C#的匿名方法则提供了一种就地提供函数委托的方法,使得委托的逻辑可以在同一条语句中表达。
除了Generic List,System.Array和许多其它泛型容器都提供了这种接受泛型委托的方法,在支持匿名方法的C#中,当然如鱼得水,发挥最大的作用。而VB(和多数其它的.NET语言)不支持匿名方法,在使用此类接受泛型委托的方法时,就必须单独创建一个函数,大大削弱了可读性,使用此类方法的优势也就不复存在。为了弥补此缺陷,让VB也能享受这类方法的便利,我们提出“谓词”的概念。其实“谓词”就是“判断”的一个更加名词化的说法。我们试图将常用的判断函数封装成类,使得他们可以被反复重用。首先定义一个封装Generic System.Predicate委托的类:UnaryPredicate(Of T)作为一元谓词的基类。Public MustInherit Class UnaryPredicateClass UnaryPredicate(Of T)
Public Shared Widening Operator CType(ByVal predicate As UnaryPredicate(Of T)) As Predicate(Of T)
Return AddressOf predicate.PredicateProcedure
End Operator
Protected......[
阅读全文]