(原创)C#零基础学习笔记011-事件和委托
微信公众号已开通,搜索微信公众号:程序喵星人。点击关注^_^
11.事件和委托
1.委托定义
委托和类一样,是一种用户自定义的类型(所以也是引用类型)。但类表示的是数据和方法的集合,而委托则持有一个或多个方法,以及一系列的预定义操作。
委托是类型,就好像类是类型一样。与类一样,委托类型必须在被用来创建变量以及类型的对象之前声明。
delegate void MyDel(int x);
创建委托对象
委托类型 变量
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; // 委托的定义和实现 namespace Lesson_40_1 { // 声明一个委托:关于加减乘除,它的返回类型都是double类型,并且参数都有两个参数且是double类型 // delegate 是声明委托的关键字 // 语法:delegate 返回类型 委托名字([参数列表]) delegate double DelOperator(double num1, double num2); class Program { static void Main(string[] args) { // 使用委托的时候,需要实例化一个委托对象,参数是方法名 DelOperator delOp = new DelOperator(add); // 在调用委托的时候,实际上调用的是委托所指向的这个方法 //double result = delOp.Invoke(3, 5); double result = delOp(3, 5); Console.WriteLine("委托调用的方法的执行结果:" + result); // 添加和移除新的委托方法 delOp += new DelOperator(div); // 委托添加一个指向的方法 result = delOp(3, 5); Console.WriteLine("添加div委托后,结果:" + result); delOp -= new DelOperator(div); // 委托移除指向的方法 result = delOp(3, 5); Console.WriteLine("移除div委托后,结果:" + result); } static double add(double a, double b) { return a + b; } static double div(double c, double d) { return c - d; } } }
2.事件
MobileServer.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Lesson_41_1 { // 手机服务端的类 public delegate void DelSendMsg(string p_msg); public class MobileServer { // 事件是委托对象的实例 public static DelSendMsg delegateSendMsg; // 有一个方法,就是将服务端的消息推送给客户端的方法。 public void sendMsg(string p_msg) { Console.WriteLine("服务端开始给客户端的手机发送推送的消息"); // 如果客户端已经订阅了该事件 if (delegateSendMsg != null) { // 事件的执行,事件的执行是关联到具体的事件绑定的方法的执行。 delegateSendMsg(p_msg); } } } }
MobileClient.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Lesson_41_1 { // 手机客户端 public class MobileClient { public void dingYue() { Console.WriteLine("手机客户端已经订阅了服务端的推送消息"); MobileServer.delegateSendMsg = new DelSendMsg(mobileServer_sendEvent); } void mobileServer_sendEvent(string p_msg) { Console.WriteLine("这是客户端手机接收到服务端推送的消息"); Console.WriteLine("服务端推送的消息是:" + p_msg); } } }
Program.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; // 事件 namespace Lesson_41_1 { class Program { static void Main(string[] args) { MobileClient mclient = new MobileClient(); mclient.dingYue(); MobileServer mserver = new MobileServer(); mserver.sendMsg("这是一个消息事件"); } } }