委托的定义和方法的定义类似,只是在定义的前面多了一个delegate关键字。方法的签名必须与委托一致,方法签名包括参数的个数、类型和顺序,方法的返回类型要和委托一致,方法的返回类型不属于方法签名的一部分。委托使得一个方法可以作为另一个方法的参数进行传递。
public delegate void MyDelegate(int paral, string para2);
使用委托的步骤为:定义委托类型-声明委托变量-实例化委托-作为参数传递给方法-调用委托。下面具体分析委托的使用过程。
(1) 定义委托类型:delegate void MyDelegate(type paral, type para2);。其定义方式类似于方法的定义,只是多了一个delegate关键字。
(2) 声明委托变量:MyDelegate d;。既然委托是一种类型,那么可以使用委托来声明一个委托变量,相当于int a。
(3) 实例化委托:d = new MyDelegate(obj.InstanceMethod);。第二步只是声明了委托变量, 但并没有将它实例化。类的实例化使用new关键字来实现,而委托也属于类类型,所以委托的实例化也使用new关键字来进行的。
(4) 作为參数传递给方法:MyMethod(d);。委托使得在C#中,可以把一个方法作为另一个方法 的参数,而委托可以看作是一个包装方法的对象。
(5) 在方法中调用委托。
通过使用"+"运算符,我们能将多个委托对象链接到一个委托对象实例上,使其成为多路广播委托实例。在调用委托链时,被绑定到委托链中的每个委托都会被执行。使用"-"可以将某个委托从委托对象移除。
定义方式:访问修饰符 event 委托类型 事件名;public event EventHandler birthday;
。
这里的访问修饰符一般定义为public,因为事件的订阅者需要对事件进行订阅与取消操作, 定义为公共类型可使事件对其他类可见。这里的委托类型,一般有两种:自定义的委托类型;.NET类库中预定义的委托类型EventHandler。事件件订阅者需要订阅事件发布者发布的事件,以便在事件被触发时接收消息并做出处理,使用“+=”运算符来订阅事件,使用“-=”运算符来取消事件订阅。
class Program { static void Main(string[] args) { //初始化发布者对象 Publisher publisher = new Publisher(); //实例化朋友对象 Buddy friendl = new Buddy("小张"); Buddy friend2 = new Buddy("小王"); //使用“+=”来订阅亨件 publisher.MyEvent += new Publisher.MyHandler(friendl.SendMessage); publisher.MyEvent += new Publisher.MyHandler(friend2.SendMessage); //发出通知 publisher.OnMarriageComing("今晚吃鸡!"); } } public class Publisher { //自定义委托类型 public delegate void MyHandler(string msg); //使用自定义委托类型定义事件,事件名为MarryEvent public event MyHandler MyEvent; //发出事件 public void OnMarriageComing(string msg) { MyEvent?.Invoke(msg); } } //接受事件的的实体类 public class Buddy { //字段 public string Name; //构造函数 public Buddy(string name) { Name = name; } //事件处理函数,该函数需要符合MyHandler委托的定义 public void SendMessage(string mssage) { //输出通知信息 Console.WriteLine(mssage); //对事件做出处理 Console.WriteLine(this.Name + "收到"); } }
EventHandler委托的定义:public delegate void EventHandler(Object sender, EventArgs e);
从EventHandler委托的定义可以看出:
□ 该委托的返回类型为void,因此实例化委托类型的方法也需要满足这点;
□ 第一个参数sender负责保存对触发事件对象的引用,其类型为object;
□ 第二个参数e负责保存事件数据
class Program { static void Main(string[] args) { //初始化发布者对象 Publisher publisher = new Publisher(); //实例化朋友对象 Buddy friendl = new Buddy("小张"); Buddy friend2 = new Buddy("小王"); //使用“+=”来订阅亨件 publisher.MyEvent += new EventHandler(friendl.SendMessage); publisher.MyEvent += new EventHandler(friend2.SendMessage); //发出通知 publisher.OnMarriageComing("今晚吃鸡!"); } } public class Publisher { // 使用EventHandler public event EventHandler MyEvent; //发出事件 public void OnMarriageComing(string msg) { MyEvent?.Invoke(this, new EventArgs()); } } //接受事件的的实体类 public class Buddy { //字段 public string Name; //构造函数 public Buddy(string name) { Name = name; } //事件处理函数,该函数需要符合MyHandler委托的定义 public void SendMessage(object s,EventArgs args) { //对事件做出处理 Console.WriteLine(this.Name + "收到"); } }
EventArgs类是.NET类库中定义的类,它不保存任何数据(属性、字段等),我们可以通过扩展EventArgs类,自定义事件类,使其带有数据。
class Program { static void Main(string[] args) { //初始化发布者对象 Publisher publisher = new Publisher(); //实例化朋友对象 Buddy friendl = new Buddy("小张"); Buddy friend2 = new Buddy("小王"); //使用“+=”来订阅亨件 publisher.MyEvent += new Publisher.MyHandler(friendl.SendMessage); publisher.MyEvent += new Publisher.MyHandler(friend2.SendMessage); //发出通知 publisher.OnMarriageComing("今晚吃鸡!"); } } public class MyEventArgs : EventArgs { public string message; public MyEventArgs(string msg) { this.message = msg; } } public class Publisher { //自定义委托类型,委托包含两个参数 public delegate void MyHandler(object sender, MyEventArgs e); //定义事件 public event MyHandler MyEvent; //发出事件 public void OnMarriageComing(string msg) { MyEvent?.Invoke(this, new MyEventArgs(msg)); } } //接受事件的的实体类 public class Buddy { //字段 public string Name; //构造函数 public Buddy(string name) { Name = name; } //事件处理函数,该函数需要符合MyHandler委托的定义 public void SendMessage(object s, MyEventArgs args) { //对事件做出处理 Console.WriteLine(this.Name + "收到"); } }
参考链接:
https://www.cnblogs.com/youmingkuang/p/11297811.html