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();
        }

結果:

 

 

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