委托与事件(一)

1.委托定义(摘自MSDN):

委托是安全封装方法的类型,类似于C和C++中的函数指针。与C函数指针不同的是,委托是面向对象的、类型安全的和可靠的

委托的类型由委托的名称确定。

 

2.委托的声明:

  • 无参的委托
public delegate void DelNoParams();
  • 单参的委托
public delegate void DelOneParams(object obj);

注:使用delegate定义委托,可以根据需要设定返回值类型,设定参数的个数及每个参数的类型。

 

3.委托的使用:

(1).通过委托调用方法

委托通常使用封装后的方法名称或者匿名方法构造。

对委托进行实例化后,委托会将需要的方法调用传递到该方法,并且委托会将方法的返回值(如果有)返回到调用方。

 1     public delegate void DelOneParams(string obj);
 2 
 3     private static void SayHello(string name)
 4     {
 5         Console.WriteLine("Hello:{0}", name);
 6     }
 7 
 8     static void Main(string[] args)
 9     {
10         DelOneParams del = new DelOneParams(SayHello);
11         del("程序员");
12 
13         Console.ReadLine();
14     }

注:委托也可以如下调用:

1     DelOneParams del = SayHello;
2     del("程序员");

 

由于实例化的委托是一个对象,因此可以作为参数传递或分配给一个属性。这允许方法作为参数接受委托并在之后调用委托,这称为异步回调。

异步回调是在长进程完成时通知调用方法的常用方法,当以这种方式使用委托时,使用委托的代码不需要知道要使用的实现方法。

 (MSDN看到的话,果然不是人类能看懂的。。。。)

 

 (2).将委托作为参数传递

回调的一个常见用途是将委托作为函数的参数进行传递:

例子中,如果需要将方法GetResult作为参数进行传递,可以先声明具有相同签名的委托,通过委托代入方法的方式进行方法传递

 1     //声明委托:单参无返回
 2     public delegate void DelOneParams(string obj);
 3     //具有和委托具有相同签名的方法
 4     public static void GetResult(string str)
 5     {
 6         Console.WriteLine(str);
 7     }
 8     //将委托作为参数进行传递
 9     public static void MethodWithCallback(int param1, int param2, DelOneParams callback)
10     {
11         callback("The Result is " + (param1 + param2).ToString());
12     }

结果:

1     static void Main(string[] args)
2     {
3         MethodWithCallback(3, 4, GetResult);
4         //-->The Result is 7
5         Console.ReadLine();
6     }

 

4.多播委托:

委托可以调用多个方法,若需要向委托的方法列表(调用列表)中添加其他方法,只需要使用操作符:“+=”或“+”。

 1    //声明委托
 2     public delegate void Del();
 3 
 4     //方法1
 5     public static void method1()
 6     {
 7         Console.WriteLine("调用了第一个方法:method1");
 8     }
 9     //方法2
10     public static void method2()
11     {
12         Console.WriteLine("调用了第二个方法:method2");
13     }

调用多播委托(委托+、-方法):

 1     static void Main(string[] args)
 2     {
 3         Del del = new Del(method1);
 4         del += method2;
 5         del();
 6 
 7         Console.ReadLine();
 8     }
 9     //输出:
10     //-->调用了第一个方法:method1
11     //-->调用了第二个方法:method2

 还可以这样调用多播委托(委托+、-委托):

 

1     Del del1 = method1;
2     Del del2 = method2;
3     Del delAll = del1 + del2 + del1;
4     delAll();
5     //输出:
6     //-->调用了第一个方法:method1
7     //-->调用了第二个方法:method2
8     //-->调用了第一个方法:method1

 

注:1.委托可以多次+、-同一个方法;

      2.委托“+”方法时,方法向后添加;委托“-”方法时,方法从后先移除最后添加的

 

多播委托广泛用于事件处理中,后续再进行介绍。

 

posted @ 2016-11-16 16:57  imstrive  阅读(250)  评论(0编辑  收藏  举报