委托和事件
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EventHandler类的使用 { public delegate void EventHandler(object sender,EventArgs e);//声明一个信号灯委托 //事件参数类与事件相关的附加信息使用该类定义和存储 class LightEventArgs:EventArgs { public int seconds; public int Seconds { get { return seconds; } } public LightEventArgs(int seconds) { this.seconds = seconds; } } //发布者 class TrafficLight { private bool color = false;//红灯true绿灯false public bool Color { get { return color; } }//灯颜色的属性 public event EventHandler ONcolorChange;//发布事件 public void ChangeColor(int seconds)//触发事件的方法 { color = !color; Console.WriteLine(color ? "红灯" : "绿灯"); //判断事件是否注册,注册者调用委托(注册:订阅者对象receiver可以注册事件) if (ONcolorChange != null) { ONcolorChange(this, new LightEventArgs(seconds));//事件没有附加信息,第二个事件参数置为空 } } } class Car {//车辆是订阅者 //车辆行驶状态,行驶为true private bool isRun = true; public virtual void LightColorChange(object s,EventArgs e) //委托处理方法 { //红灯亮,并且正在行驶 if (isRun&&((TrafficLight)s).Color) { isRun = false; Console.WriteLine("{0}停车,{1}秒后启动", this,((LightEventArgs)e).Seconds); } else if (!isRun &&!((TrafficLight)s).Color) { isRun =true; Console.WriteLine("{0}停车,{1}秒后通过", this, ((LightEventArgs)e).Seconds); } } public void dy(TrafficLight tl) { tl.ONcolorChange += LightColorChange;//订阅发布的事件,将委托处理方法注册到委托中 } public void qxdy(TrafficLight tl) { tl.ONcolorChange-= LightColorChange; } } //对发布的事件进行订阅 class Program { static void Main(string[] args) { TrafficLight TL = new TrafficLight();//实例化发布者 Car car1 = new Car();//实例化订阅者 car1.dy(TL);//向发布者注册事件 //触发事件 TL.ChangeColor(30);//事件发生,car1随之响应 TL.ChangeColor(60);//事件发生,car1随之响应 Console.ReadLine(); Directory.CreateDirectory(@"c:\temp\xx"); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { //定义和使用委托 public delegate void DelegateName(int x, int y); class Program { static void Main(string[] args) { me m = new me(); DelegateName fun1 = new DelegateName(m.fun4);//委托调用实例方法 fun1(2, 4);//委托调用 fun1 = new DelegateName(fun2); fun1(2, 4);//委托调用 fun1 = new DelegateName(fun3); fun1(2, 4);//委托调用 Console.ReadLine(); } private static void fun2(int x, int y) { Console.WriteLine("fun2方法" + (x + y)); } private static void fun3(int x, int y) { Console.WriteLine("fun3方法" + (x - y)); } } class me { public void fun4(int x, int y) { Console.WriteLine("fun4方法" + (x * y)); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 泛型委托 { //定义和使用委托 public delegate void DelegateName<T>(T x, T y); class Program { static void Main(string[] args) { DelegateName<string>fun = delegate (string x, string y) { x = "Hello";y = "\t"; Console.Write(x+y); }; fun += delegate (string x, string y) { x = "World"; y= " !"; Console.WriteLine(x+y); }; fun("",""); Console.ReadLine(); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 匿名方法 { //定义和使用委托 public delegate void DelegateName(int x, int y); class Program { static void Main(string[] args) { //将方法直接封装到委托中,然后调用委托 DelegateName fun = delegate (int x, int y) { Console.WriteLine("第一个方法"); }; fun += delegate (int x, int y) { Console.WriteLine("第二个方法"); }; fun += delegate (int x, int y) { Console.WriteLine("第三个方法"); }; fun(5, 2); Console.ReadLine(); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 事件的发布和订阅 { /// <summary> /// 因为在委托中使用=订阅委托时,会覆盖所有订阅,使最后一个订阅生效,其他都被覆盖无效,所以,我们使用事件(event)限制使用委托的方式 /// 订阅事件的时候,必须使用"+=""-="才能通过编译 /// </summary> /// <param name="color"></param> public delegate void LightEvent(bool color);//声明一个信号灯委托 //发布者 class TrafficLight {//红灯true绿灯false private bool color = false; public bool Color { get; set; }//灯颜色的属性 public event LightEvent ONcolorChange;//发布事件 public void ChangeColor()//触发事件的方法 { color = !color; Console.WriteLine(color ? "红灯" : "绿灯"); //判断事件是否注册,注册者调用委托(注册:订阅者对象receiver可以注册事件) if (ONcolorChange != null) { ONcolorChange(color); } } } class Car {//车辆是订阅者 //车辆行驶状态,行驶为true private bool isRun = true; public virtual void LightColorChange(bool color) //委托处理方法 { //红灯亮,并且正在行驶 if (isRun && color) { isRun = false; Car car1 = new Car(); Console.WriteLine("{0}停车", car1); } //绿灯亮并且未行驶 if (!isRun && !color) { isRun = true; Console.WriteLine("{0}启动", this); } } public void dy(TrafficLight tl) { tl.ONcolorChange += LightColorChange;//订阅发布的事件,将委托处理方法注册到委托中 } } //对发布的事件进行订阅 class Program { static void Main(string[] args) { TrafficLight TL = new TrafficLight(); Car car1 = new Car(); car1.dy(TL); TL.ChangeColor();//事件发生,car1随之响应 TL.ChangeColor();//事件发生,car1随之响应 Console.ReadLine(); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 委托的发布和订阅 { //事件是一种特殊类型的委托 //事件的发布订阅就是委托的发布订阅 //发布订阅有发送者和若干接受者(订阅者) //声明委托 public delegate void LightEvent(bool color);//声明一个信号灯委托 //发布者 class TrafficLight {//红灯true绿灯false private bool color = false; public bool Color { get; set; }//灯颜色的属性 public LightEvent ONcolorChange;//发布委托 public void ChangeColor()//触发事件的方法 { color = !color; Console.WriteLine(color?"红灯":"绿灯"); //判断事件是否注册,注册者调用委托(注册:订阅者对象receiver可以注册事件) if (ONcolorChange != null) { ONcolorChange(color); } } } class Car {//车辆是订阅者 //车辆行驶状态,行驶为true private bool isRun = true; public virtual void LightColorChange(bool color) //委托处理方法 { //红灯亮,并且正在行驶 if (isRun&&color) { isRun = false;Car car1 = new Car(); Console.WriteLine("{0}停车",car1); } //绿灯亮并且未行驶 if (!isRun&&!color) { isRun = true; Console.WriteLine("{0}启动",this); } } public void dy(TrafficLight tl) { tl.ONcolorChange += LightColorChange;//订阅发布的事件,将委托处理方法注册到委托中 tl.ONcolorChange -= LightColorChange;//取消订阅发布的事件 } } //对发布的事件进行订阅 class Program { static void Main(string[] args) { TrafficLight TL = new TrafficLight(); Car car1 = new Car(); car1.dy(TL); TL.ChangeColor();//事件发生,car1随之响应 TL.ChangeColor();//事件发生,car1随之响应 Console.ReadLine(); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 组合委托 { //定义和使用委托 public delegate void DelegateName(int x, int y); class Program { static void Main(string[] args) { me m = new me(); DelegateName fun1 = new DelegateName(m.fun4);//委托调用实例方法 fun1 += new DelegateName(fun2); fun1 += new DelegateName(fun3); fun1(2, 4);//组合委托调用--依次调用 Console.ReadLine(); } private static void fun2(int x, int y) { Console.WriteLine("fun2方法" + (x + y)); } private static void fun3(int x, int y) { Console.WriteLine("fun3方法" + (x - y)); } } class me { public void fun4(int x, int y) { Console.WriteLine("fun4方法" + (x * y)); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构