C#委托和事件


首先说明 (1)C#中事件:事件时属于类的成员,所以要放在类的内部。 (2)委托属于一个定义,是和类、接口类似的,通常放在外部。 (因为大多数委托都要被重用) 委托定义在类里面还是类外面视情况而定,一般定义在与类定义平级部分, 且用public修饰,便于外部调用。 若定义在类的内部,则必须通过调用该类的成员才能取得其委托的引用, 频繁调用的情况下不合适。
委托定义在类内部,举例说明如下:
Class A {
  //声明在这里是可以的~
  private delegate void test_del(int a);
  
  private void test(){...}
  public void start(){
    //声明在这里就不行了~
    private delegate void test_del(int a);
  }
}

委托是一种特殊的类,和普通类不同的是委托是对一类方法的抽象。

因此只能在类内部定义内部类(包括委托、结构和枚举)而不能在方法中定义

委托是事件的基础,事件又对委托进行了封装。

大致来说,委托是一个类,该类内部维护着一个字段,指向一个方法。事件可以被看作一个委托类型的变量,通过事件注册、取消多个委托或方法。

在Winform和以前的WebForm中,事件被大量使用,是必须掌握的知识(但MVC不是事件驱动的),一个完整的事件流程包括:

在类里面定义一个委托,声明事件用于发布,

    public class Button
    {
        //定义事件,用于发布
        public event EventHandler OnClick;    //注意:EventHnadler是一个委托
        public void click()
        {
            if (OnClick != null)
            {
                OnClick(this, new EventArgs());
            }
        }
    }

实例化一个发布了OnClick事件的button。事件被btn_click订阅,即:当这个btn被click时调用btn_click()方法

            //实例化一个发布了OnClick事件的button
            Button btn = new Button();
            //事件被btn_click订阅,即:当这个btn被click时调用btn_click()方法
            btn.OnClick += btn_click;

 写一个静态方法

        private static void btn_click(object sender, EventArgs e)
        {
            Console.WriteLine("1111111");
        }

触发事件

//事件被触发
            btn.click();

注意:

event和delegate都可以被多次订阅(+=)/退订(-=)

总结:
○ 委托就是一个类,也可以实例化,通过委托的构造函数来把方法赋值给委托实例
○ 事件可以看作是一个委托类型的变量
○ 通过+=为事件注册多个委托实例或多个方法
○ 通过-=为事件注销多个委托实例或多个方法
○ EventHandler就是一个委托

文章转载自:软件开发平台
地址:https://www.hocode.com/

相关