最近学习C#,看到Predicate部分,下面结合自己的理解,大致的讲解一下。如有错误及纰漏之处,还请指正。
delegate 委托
其实理解起来最相似的就是C/C++里的函数指针了,例如:
- typedef void mydelegate(char * args);
-
- void myFunc(char * args){};
- void myFunc2(mydelegate inFunc,char * args){
- inFunc(args);
- }
-
- int main(){
- mydelegate xx;
- xx=myFunc;
- xx();
-
- }
然后我们就可以声明一个签名与mydelegate一致的函数,赋值给xx了,当然,mydelegate也可以作为函数的参数类型。委托就是如此。 但是,事件委托有一个特别地方,那就是它有一个队列,当我们绑定到一个事件时,我们的函数只是加入了这个队列,事件发生时,会按队列顺序依次调用函数,就像HOOK一样。
下面参考:http://technet.microsoft.com/zh-cn/library/bfcke1bz
Predicate 在C#中 的声明为
public delegatebool Predicate<in T>(T obj)
可以看出来,Predicate是一个委托类型,而且是一个泛型的委托类型。
MSDN中提到了这句:
Visual Basic 和 C# 用户不需要显式创建委托,也不需要指定泛型方法的类型参数。编译器会根据您提供的方法参数确定必需的类型。
Predicate是一个特殊的委托,它由C#.net 或VB.net声明(事实上,如同上面的mydelegate,如果不提前声明,.net自己也没法用,就如同API中的CALLBACK等等),我们可以使用这个类型来创建自己的委托。
但是,由于编译器的智能化,我们不需要显式创建这个委托。
但是本质上,我们仍然可以显式创建,这可以加深理解,代码如下:
- using System;
-
- public class PredicateTest
- {
- public PredicateTest()
- {
- }
-
-
-
-
- int[] myarr = new int[]{ -1, -2, -3, 4, 5, 6, 0 };
-
-
- bool func(int i)
- {
- return i > 0;
- }
-
-
- int[] getIntBiggerThan01(int[] intArr)
- {
-
- Predicate<int> mypre = new Predicate<int>(func);
-
-
- return Array.FindAll(intArr, mypre);
- }
-
-
- int[] getIntBiggerThan02(int[] intArr)
- {
-
- return Array.FindAll(intArr, new Predicate<int>(func));
- }
-
-
- int[] getIntBiggerThan03(int[] intArr)
- {
-
- return Array.FindAll(intArr, (i) =>{return i > 0;} );
- }
-
- public void TestPredicate()
- {
- Console.WriteLine("-------------------------TestPredicate-----------------------");
- Console.WriteLine("---------getIntBiggerThan01--------");
- foreach (int i in getIntBiggerThan01(myarr))
- Console.WriteLine(i.ToString());
- Console.WriteLine("---------getIntBiggerThan02--------");
- foreach (int i in getIntBiggerThan02(myarr))
- Console.WriteLine(i.ToString());
- Console.WriteLine("---------getIntBiggerThan03--------");
- foreach (int i in getIntBiggerThan03(myarr))
- Console.WriteLine(i.ToString());
- Console.ReadKey();
- }
- }
- 客户端调用代码为
- PredicateTest pt = new PredicateTest();
- pt.TestPredicate();
结果:
转载于http://blog.csdn.net/shamork/article/details/8564764