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/