zoukankan      html  css  js  c++  java
  • 委托与事件(一)

    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.委托“+”方法时,方法向后添加;委托“-”方法时,方法从后先移除最后添加的

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

  • 相关阅读:
    python 文件 笔记
    python 模块、包 笔记
    类、对象
    python 函数 笔记
    测试价值体现
    断舍离-笔记2
    Happy 2006 POJ
    Triangle War POJ
    Complete the sequence! POJ
    放苹果 POJ
  • 原文地址:https://www.cnblogs.com/imstrive/p/6070273.html
Copyright © 2011-2022 走看看