对于委托和事件,看了不少博文,当时好像都理解了,过了一段时间,又忘记的差不多了。每每如此,感觉自己很笨,记性差,其实是没有深入理解透切,没有按照自己的语言表达出来,当然容易忘记。今天又花了一些时间,好好理解,总结别人的文章,用自己文字概况出来。
总结如下:
委托可以定义任何地方,应该说是委托声明
事件类可以单独放一个地方,包含一些属性
事件一定定义在发布者里面,应该说是事件声明,并在这里做判断注册事件,给事件类属性赋值
订阅者,也就是事件的受理者,它里面有些方法并后续操作。
客户端把发布者与订阅者关联起来。
发布者.事件+=订阅者.方法
或者
发布者.事件+=new 委托声明类.委托(订阅者.方法)
发布者.方法--调用事件的方法
代码实例
发布者
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace dazilianxi.deleteevent { //商家,发布商品肯定包含一些属性,就是给商品赋值实例化 public class Provider { public delegate void DaZheEventHandler(object sender, ProductEventArgs e);//声明委托 public event DaZheEventHandler DaZhe;//声明事件 protected virtual void FaBuChanPin(ProductEventArgs e) { if (DaZhe != null) { this.DaZhe(this, e);//注册事件 } } private decimal price = 18000M; public void ShangJia(int discout) {//事件赋值 this.FaBuChanPin(new ProductEventArgs { Price = discout*price/10, ProAddress = "中国广东", ProName = "红日电器", Discount = discout }); } } }
事件类
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace dazilianxi.deleteevent { //事件类,包含商品一些属性 public class ProductEventArgs : EventArgs { public decimal Price { get; set; } public string ProName { get; set; } public string ProAddress { get; set; } public int Discount { get; set; } } }
订阅者
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace dazilianxi.deleteevent {//就是我们,我们有购买行为(方法) public class Custome { public void OnGouMai(object sender,ProductEventArgs e) { if (e.Price < 15000M) { Console.WriteLine("大家快了买,产于" + e.ProAddress + "的" + e.ProName + "打" + e.Discount + "折了。目前价格是" + e.ProName + "很划算了"); } else { OnGuanKan(); } } public void OnGuanKan() { Console.WriteLine("再等等看!"); } } }
客户端
class Program { static void Main(string[] args) { //客户端二者关联 Provider shangjia = new Provider(); shangjia.DaZhe += new Provider.DaZheEventHandler(new Custome().OnGouMai);//第一种方式 shangjia.ShangJia(2); Provider shangjia2 = new Provider(); shangjia2.DaZhe += new Custome().OnGouMai;//第二种方式 shangjia2.ShangJia(9); } }
结果图
参考:
http://www.cnblogs.com/wudiwushen/archive/2010/04/23/1717829.html
http://www.cnblogs.com/jimmyzhang/archive/2007/09/23/903360.html
时间: 2024-12-06 10:00:52