event 怎么使用,什么时候该用

 

 

 

 

首先延续前一篇:

委托是一种类型,事件是委托类型的一个实例,加上一个event 关键字的权限控制

我的理解就好比 

有一个类 叫 Student, 而 事件就是 Student 的一个实例 

new 小美 = new student(){爸爸= "班主任", 颜值=颜值.超模级别}

   叫小美,但是小美很特殊,她是班主任的女儿,那也就只能发生一些平常的交互了,想要谈恋爱是没可能了,权限被控制

event 关键字就好比 不能撩

 

那么转回正题: 

事件(观察者模式)的作用就是完成固定动作 ,把可变动作分离出去,由外部控制,可以随意扩展

搭建框架时恰好就需要这个特点,通过事件分离可变动作,支持拓展

WinFrom中事件的使用:

 

event 为什么要加权限控制?

就是为了避免外部乱改

先看一下 EventHandler 这个委托 

 

在WinFrom 可以很高频率的看见这个委托, 都是将它实例化为 event 来 做点击或其他事件的触发

结合搞Javascript 的经验这个 object  和 EventArgs  就类似事件源对象 ,再看一眼 Eventargs 这个类

看起来也是空空的 ,基本上都是自己继承继承以后,自己来规定要返回的事件信息,后面会有示例

标准event 使用实例:

发布者:

      public class IphoneX
   {
        public string Type { get; set; }

        private decimal _Price;
        public decimal Price {
            get { return _Price; }
            set
            {
                if (value < this._Price)
                {
                    this.DiscountHandler?.Invoke(this, new XEventArgs() {
                        OldPrice = this.Price,
                        NewPrice = value
                    });

                }
                _Price = value;
            }
        }

        public event EventHandler DiscountHandler;
 
   }
    public class XEventArgs : EventArgs
    {
        public decimal NewPrice { get; set; }
        public decimal OldPrice { get; set; }
    }

订阅者:

public class Subscriber
   {
        public string Name { get; set; }

        public void SubscribMsg(object goods, EventArgs args)
        {
            var realArgs = (XEventArgs)args;
            var realGoods = (IphoneX)goods;
            Console.WriteLine($" {this.Name}!, {realGoods.Type} IphoneX 降价了  从 {realArgs.OldPrice }降到了{realArgs.NewPrice}!");
        }
   }

绑定关系:

 static void Main(string[] args)
        {
            var iphoneX = new IphoneX()
            {
                Type = "国内版",
                Price = 6000
            };
         
            iphoneX.DiscountHandler += new Subscriber() { Name = "小美" }.SubscribMsg;

            iphoneX.Price = 5000;
            iphoneX.Price = 4000;
            iphoneX.Price = 3000;
            iphoneX.Price = 6000;
            Console.Read();
        }

结果:

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章