委托
委托的定义
如果我们要把方法当做参数传递的话,就需要用到委托。简单来说委托就是一个类型(所以无法在类中被声明),这个类型可以复制一个方法的引用。委托是C#实现回调函数的一种机制,用于当满足某种条件时就触发回调函数,实现所需方法的调用。具体示例可看观察者模式。
ps:静态类中的委托不能指向非静态的方法,也不能指向类的实例中的非静态方法。(自己敲下代码就知道了)
声明委托
使用委托的步骤:首先需要定义委托,然后告诉编译器这个委托可以指向哪些类型的方法,最后创建委托的实例。
定义一个委托要定义方法的参数和返回值,使用关键字delegate定义。
定义委托的语法:delegate void IntMethodInvoker(int x);
如上面这个委托指向的方法要带有一个int类型的参数,而且方法的返回值是void。
其他案例:
delegate double TwoLongOp(long first,long second); delegate string GetString();
基本使用
实例1:
private delegate string GetAString(); int x = 40; //第一种调用方式: GetAString a = new GetAString(x.ToString); string s = a(); //第二种调用方式: GetAString a =x.ToString; string s = a.Invoke(); Console.WriteLine(s); Console.ReadKey();
实例2:(将委托作为方法参数传递)
private delegate void PrintString(); static void PrintStr(PrintString Print) {Print();} static void Method1() {Console.WriteLine(“Method1”);} Main中: PrintString ps = Method1;//同实例1 PrintStr(ps); Console.ReadKey();
Action委托
Antion是系统内置(预定义)的一种委托类型,它可以指向一个没有返回值,0-16个参数的方法。
实例1:(指向无参函数)Action
static void Print() {Console.WriteLine(“This is Action”);}
Main中:
Action a = Print; a();//亦可a.Invoke(); Console.ReadKey();
实例2:(指向有参函数)Action<T0 T1,T T2......T T15>
static void AddInt(int i1,int i2) {Console.WriteLine(i1+i2);}
Main中:
Action<int,int> a = AddInt; a(11,22);//a.Invoke(11,22); Console.ReadKey();
Func委托
Func是系统内置(预定义)的一种委托类型,它可以指向一个返回值,0-15个参数的方法(所以<>内至少得有一个参数)。
Func<T T0,T T1.......out T15>
实例:
static string GetIntAdd(int i1,int i2) { return (i1+i2).ToString() };
Main中:
Func<int,int,string> f = GetIntAdd; Console.WriteLine( f(11,22) ) ; Console.ReadKey();
Action委托和Func委托都是系统预定义的委托,某些情况下懒得定义委托时可以直接使用这两种类型