委托与事件小demo
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了委托与事件小demo相关的知识,希望对你有一定的参考价值。
1 /// <summary> 2 /// 水温报警器 3 /// </summary> 4 public class WoterWarmEvent 5 { 6 /*** 7 ** 1.定义delegate对象类型,它有两个参数,第一个参数是事件发送者对象,第二个参数是事件参数类对象。 8 * 2.定义事件参数类,此类应当从System.EventArgs类派生。如果事件不带参数,这一步可以省略。 9 * 3.定义事件处理方法,它应当与delegate对象具有相同的参数和返回值类型。 10 * 4.用event关键字定义事件对象,它同时也是一个delegate对象。 11 * 5.用+=操作符添加事件到事件队列中(-=操作符能够将事件从队列中删除)。 12 * 6.在需要触发事件的地方用调用delegate的方式写事件触发方法。 13 * 一般来说,此方法应为protected访问限制,既不能以public方式调用,但可以被子类继承。名字是OnEventName。 14 * 7.在适当的地方调用事件触发方法触发事件。 15 * **/ 16 17 //1.定义delegate对象类型 18 public delegate void WarmEventHandler(object sender, MyWarmEventArgs e, ref string date); 19 //4。用event关键字定义事件对象,它同时也是一个delegate对象 20 public event WarmEventHandler myEvent; 21 22 public WoterWarmEvent() 23 { 24 25 //5. 用+=操作符添加事件到事件队列中 26 myEvent += new WarmEventHandler(WoterWorm); 27 28 29 } 30 31 public static void Main(string[] args) 32 { 33 34 int temp = 1; 35 for (int i = 0; i < 100; i++) 36 { 37 temp = i * 3 + i * 2; 38 if (temp > 90) 39 { 40 41 MyWarmEventArgs e = new MyWarmEventArgs("海尔", "2015-12-25", "上海"); 42 WoterWarmEvent even = new WoterWarmEvent(); 43 string date = ""; 44 if (even.myEvent != null) 45 { 46 even.myEvent(even, e, ref date); 47 //even.myEvent(even, e2, ref date); 48 } 49 Console.WriteLine("~~当前水温:" + temp + "°"); 50 Console.WriteLine("~~报警时间:" + date); 51 break; 52 } 53 else 54 { 55 Console.WriteLine("~~当前水温:" + temp + "°"); 56 } 57 58 } 59 60 Console.Read(); 61 } 62 63 64 /// <summary> 65 /// 水温警告的方法 66 /// </summary> 67 /// <param name="sender"></param> 68 /// <param name="e"></param> 69 protected void WoterWorm(object sender, MyWarmEventArgs e, ref string date) 70 { 71 date = DateTime.Now.ToString(); 72 Console.WriteLine("~~~~~嘀嘀嘀嘀嘀!"); 73 Console.WriteLine("~~~~~水温报警!"); 74 Console.WriteLine("信息如下:" + e.GetName() + "牌热水器,生产时间:" + e.GetDate() + ";产地:" + e.GetProduct()); 75 } 76 } 77 78 79 80 81 /// 2.定义事件参数类 82 /// <summary> 83 /// 定义事件参数类 84 /// </summary> 85 public class MyWarmEventArgs : EventArgs 86 { 87 private string name; 88 private string date; 89 private string product; 90 91 public MyWarmEventArgs(string name, string date, string product) 92 { 93 this.name = name; 94 this.date = date; 95 this.product = product; 96 } 97 public string GetName() 98 { 99 return this.name; 100 } 101 102 public string GetDate() 103 { 104 return this.date; 105 } 106 public string GetProduct() 107 { 108 return this.product; 109 } 110 111 }
以上是关于委托与事件小demo的主要内容,如果未能解决你的问题,请参考以下文章
对“xxx”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。 错误解决一例。(代码片段