zoukankan      html  css  js  c++  java
  • 温故而知新委托

    委托是一种定义方法签名的类型。

    当实例委托时,您可以将其实例与任何具有兼容签名的方法相关联。可以通过委托实例调用方法。

    委托用于将方法作为参数传递给其他方法。事件处理程序就是通过委托调用的方法。

    自己创建一个自定义的方法,当发生特定事件时某个类(控件)就可以调用您的方法。委托的声明如下:

    pubic delegate int Calculation(int x,int y);

    与委托的签名(返回类型和参数)匹配的任何可访问类或结构中的任何方法都可以分配给该委托。方法可以是静态方法,也可以是实例方法。

    在方法重在的上下文中,方法的签名不包括返回值。但在委托的上下文中,签名包括返回值。也就是,方法和委托必须具有相同的返回值。

    委托特点:

    委托类似于C++函数指针,但它们是类型安全的。

    委托允许将方法作为参数进行传递。

    委托可以用于定义回调方法。

    委托可以链接在一起。例如:可以对一个事件调用多个方法。

    方法不必与委托签名完全匹配。(变体)

    2.0中匿名方法的概念,允许将代码块作为参数传递,以代替单独定义的方法。3.0引入Lamnda表达式,可以更简练的编写内联代码块。匿名方法和Lambda表达式(在某些上线问中)都可以编译为委托类型。

    委托是一种安全的封装方法的类型,它与C和C++类似。不同的是,委托是面向对象的、类型安全的和保险的。

    public delegate void Del(string message);

    该委托可以封装一个采用字符串作为参数并返回void的方法。

    构造委托对象时,通常提供委托将包装的方法的名称或使用匿名方法。实例化委托后,,委托将把对它进行的方法调用传递给方法。调用传递给问哦拖的参数被传递给方法,来自方法的返回值(如果有)将由委托返回给调用方。可以将一个实例化的委托视为被包装的方法本身来调用该委托。

    public delegate void DelMethod(string message)

    {

       Console.WriteLine(message);

    }

    Del hand=DelMethod;

    hand("hello wprd");

    委托派生自Delegate类。委托类型是密封的,不能从Delegate中派生委托类型,也不能从中派生自定义类。由于实例化委托是一个对象,多疑可以将其作为参数进行传递,也可以将其赋值给属性。这样,方法就可以将一个委托作为参数来接受,并以后可以调用该委托。(异步回调!!).在较长的进程完成后用来通知调用方的常用方法。

    回调还有一个常用法。

    自定义一个比较方法并将该委托传递给排序方法。

    调用委托时,可以调用多个方法。称为多路广播。想委托的方法列表中添加额外的方法,只需要使用“+”或“+=”。话不多说,上例子:

    public class Methods

    {

      public void Method1(string message){}

      public void Method2(string message){}

      public void Method3(string message){}

    }

     Methods me=new Methods();

    Del d1=me.Method1;

    Del d2=me.Method2;

    Del d3=me.Method3;

    Del allMethodsDelegate=d1+d2;

    allMethodsDelegate+=d3;

    此时,allMethodsDelegate在起调用列表中包含三个方法Method1、Method2、Method3.原来的三个委托d1、d2、d3保持不变。

    调用allMethodsDelegate时,将按顺序调用这三个方法。如果委托使用引用参数,则引用将依次传递给这三个方法中的每个方法,由一个方法引起的更改对下一个方法是可见的。如果任意一个方法引发了异常,而在该方法内未捕捉该异常,则该异常将传递给委托的调用方,后面的方法将不调用。如果委托有返回值或输出参数,返回最后调用的方法的返回值或参数。

    如果要将方法从调用列表中移除用“-”或“-=”。

  • 相关阅读:
    廖雪峰的多线程 1
    保持良好的心态 戒骄戒躁
    Break camelCase
    int32 to IPv4 (int32到IPv4地址转换)
    Stop gninnipS My sdroW!
    Find The Parity Outlier 找到奇偶校验异常值
    今日新闻整理 2020-7-31
    改造rabbitmq demo 到 jpa
    Flink实战(110):FLINK-SQL应用场景(11)connector(十九)Flink 与 hive 结合使用(七) Flink Hive Connector 使用
    Hadoop基础(六十):面试题 Hadoop数据切片(二)切片机制源码
  • 原文地址:https://www.cnblogs.com/zhangxiaohui/p/2548049.html
Copyright © 2011-2022 走看看