C#委托和事件

委托:

1.可以认为委托是持有一个或多个方法的对象。

2.委托和类一样,是用户自定义的一种类型。

  Delegate void mydel(int value);

3.可以通过以下步骤来使用委托:

  1).声明一个委托类型。委托声明看上去和方法声明相似,只是没有实现块。

  2).使用该委托类型的一个声明变量。

  3).创建委托类型的对象,把它赋值给委托变量。新的委托对象包括指向某个方法的引用,这个方法和第一步定义的签名和返回类型一致。

  4).你可以选择为委托对象增加其他方法。这些方法必须与第一步中定义的委托类型有相同的签名和返回类型。

  5).在代码中你可以像调用方法一样调用委托。在调用委托的时候,其包含的每一个方法都会执行。

  6).委托添加可用+,删除可用-.

4.匿名方法:

  如果方法只被使用一次,在这种情况下,除了创建委托的语法需要,没有必要创建独立的具名方法。匿名方法允许我们避免使用独立的具名方法。

    Example 1:(非匿名)

      class Program{

        public static int add(int x){

          return x+20;}

        delegate int mydel(int value);

        static void main(){

        mydel my=add;

        my(5);

        }}

    Example 2.(匿名)

      class Program{

        delegate int mydel(int value);

        static vod main(){

          mydel my=delegate(int value){

            return x+20;}

            my(5);

          }}

  我们可以在如下地方使用匿名方法:

    1. 声明委托变量时作为初始化表达式。
    2. 组合委托时赋值语句在右边。
    3. 为委托增加事件时在赋值语句右边。

  匿名方法的语法:

    关键字 参数列表 语句块

    delegate(Parametes){ImplementationCode}

5.Lambda表达式

  在C#2.0引入delegate,在c#3.0时引入Lambda表达式简化匿名方法,如果Lambda先出则无需匿名方法。

  Mydel del=delegate(int x){return x+20;}

    Mydel de = (int x)=>{return x+20;}

  编译器可以从委托声明知道委托参数的类型,故Lambda表达式允许我们省略关键字如Lea2。带有类型的参数列表称为显式参数,省略类型的参数列表称为隐式参数.

  如果只有一个隐式参数则可以省略括号如Lea3。

  如果表达式中只有一个语句,省略大括号入Lea4.

    Mydel del=delegate(int x) {return x+1;}

    Mydel lea1= (int x) =>{return x+1;}

    Mydel lea2= (x) =>{return x+1;}

    Mydel lea3= x =>{return x+1;}

    Mydel lea4= x =>return +1;

事件

发布者/订阅者模式:发布者发布消息,所有订阅者能够获取通知。

1.声明事件

  class Incrementer{

  关键字 事件名字

    public event EventHandler CountedAdozen}

  委托类型

  事件是成员:一个常见的误解是把事件认为是类型,然而它和方法、属性一样,事件是类或结构的成员。

2.订阅事件

  使用+=添加,添加成员可以是如下实例方法、静态方法、匿名方法和Lambda表达式。

3.触发事件

  首先判断事件是否为空,如不类似函数执行

4.标准事件的用法

  对于事件的使用,.net框架提供了一个标准模式。事件使用的标准模式的根本就是System命名空间声明的EventHandler委托类型。关于该类型声明以下几点:

  1. 第一个参数用来保存触发事件的对象引用。由于是Object类型,所以可以匹配任何类。
  2. 第二个参数用来保存状态信息,指明什么类型适用于该应用程序。
  3. 返回类型是void。

  EventHandler委托类型的第二个参数是EventArgs类的对象,它声明在System命名空间中。EventArgs设计为不能传递任何数据。它用于不需要传递数据的事件处理程序——通常会被忽略。如果你希望传递数据,必须声明一个派生自EventArgs,使用合适的字段保存需要的数据。

  尽管EventArgs类实际上并不传递数据,但它是使用EventHandler委托模式的重要部分。不管参数使用的实际类型是什么,object和EventArgs总是基类。这样EventHandler就能对所有事件和事件处理器都通用的签名,只允许俩个参数,而不是各自都拥有签名。

  通过拓展EventArgs来传递参数,使用泛型类EventHandler<拓展的EventArgs>;随后的事件订阅者中的委托事件Test(object o,拓展的类型 t);

  使用-=移除事件。

5.事件访问器

  有俩个访问器:add和remove

    public event EventHandler c{

    add{}

    remove{}

    }

原文地址:https://www.cnblogs.com/dlvguo/p/9682502.html