zoukankan      html  css  js  c++  java
  • 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{}

        }

  • 相关阅读:
    浅谈Java中的深拷贝和浅拷贝(转载)
    浅析Java中的final关键字
    Java内部类详解
    那些年震撼我们心灵的音乐
    深入理解Java的接口和抽象类
    Java:类与继承
    Java中的static关键字解析
    Java垃圾回收机制
    java 字节流和字符流的区别 转载
    Java 输入输出流 转载
  • 原文地址:https://www.cnblogs.com/dlvguo/p/9682502.html
Copyright © 2011-2022 走看看