C#中的事件


什么是事件

  • 事件(Event) 基本上說是一個用戶操作,如按鍵、點擊、鼠標移動等等,或者是一些出現,如系統生成的通知。應用程序需要在事件發生時響應事件。例如,中斷。事件是用於進程間通信。

使用事件

  • 如何定義事件
    • 使用event關鍵字
    訪問修飾符 event 委托類型 事件名;
    
    • 訂閱與取消事件(使用"+=","-=")
    //新郎官類,充當事件發布者角色
    class Bridegroom
    {
        //自定義委托
        public delegate void MarryHandler(string msg);
        //使用自定義委托類型定義事件,事件名為MarrEvent
        public  event MarryHandler MarrayEvent;
    
        //發出事件
        public void OnMarriageComing(string msg)
        {
            //判斷是否綁定了事件處理方法
            if (MarrayEvent!=null)
            {
                //觸發事件
                MarrayEvent(msg);
            }
        }
        static void Main(string[] args)
        {
            //初始化新郎官對象
            Bridegroom bridegroom = new Bridegroom();
    
            //實例化朋友對象
            Friend friend1 = new Friend("張三");
            Friend friend2 = new Friend("李四");
            Friend friend3 = new Friend("王五");
    
            //使用"+="訂閱消息
            bridegroom.MarrayEvent += new MarryHandler(friend1.SendMessage);
            bridegroom.MarrayEvent += new MarryHandler(friend2.SendMessage);
    
            //使用"-="取消消息
            bridegroom.MarrayEvent -= new MarryHandler(friend2.SendMessage);
    
            //發出通知
            bridegroom.OnMarriageComing("到時來參見婚禮!");
            Console.ReadLine();
    
            //輸出結果為
            //到時來參加婚禮!
            //張三收到了,到時候來參加
    
        }
    
        //朋友類
        public class Friend
        {
            //字段
            public string Name;
            //構造函數
            public Friend(string name )
            {
                Name = name;
            }
    
            //事件處理函數,該函數符合MarryHandler委托的定義
            public void SendMessage(string mssage)
            {
                //輸出通知消息
                Console.WriteLine(mssage);
                //對事件做出處理
                Console.WriteLine(this.Name+"收到了,到時候來參加");
            }
    
        }
    }
    
    • EventHandler系統委托類
      • EventHandler系統委托類定義
      public delegate void EventHandler(Object sender,EventArgs e);
      
      • 第一個參數sender負責保存對觸發事件對象的引用,其類型為Object
      • 第二個參數e負責保存事件數據,EventArgs也是.NET類庫中定義的類,它不保存任何數據
    • 擴展EventArgs類
      • 因為EventHandler只用於處理不包含事件數據的事件.如果我們想要在由這種方式定義的事件中包含事件數據,則可以通過派生EventArgs類來實現
      namespace MyEvent
      {
          //自定義事件類,並使其帶有事件數據
          public class MarryEventArgs:EventArgs
          {
              public string Message;
              public MarryEventArgs(string msg)
              {
                  Message = msg;
              }
          }
      
          //新郎官類,充當事件發布者角色
          class Bridegroom
          {
              //自定義委托
              public delegate void MarryHandler(object sender,MarryEventArgs e);
              //使用自定義委托類型定義事件,事件名為MarrEvent
              public event MarryHandler MarrayEvent;
      
              //發出事件
              public void OnMarriageComing(string msg)
              {
                  //判斷是否綁定了事件處理方法
                  if (MarrayEvent != null)
                  {
                      //觸發事件
                      MarrayEvent(this,new MarryEventArgs(msg));
                  }
              }
              static void Main(string[] args)
              {
                  //初始化新郎官對象
                  Bridegroom bridegroom = new Bridegroom();
      
                  //實例化朋友對象
                  Friend friend1 = new Friend("張三");
                  Friend friend2 = new Friend("李四");
                  Friend friend3 = new Friend("王五");
      
                  //使用"+="訂閱消息
                  bridegroom.MarrayEvent += new MarryHandler(friend1.SendMessage);
                  bridegroom.MarrayEvent += new MarryHandler(friend2.SendMessage);
      
                  //使用"-="取消消息
                  bridegroom.MarrayEvent -= new MarryHandler(friend2.SendMessage);
      
                  //發出通知
                  bridegroom.OnMarriageComing("到時來參見婚禮!");
                  Console.ReadLine();
      
                  //輸出結果為
                  //到時來參加婚禮!
                  //張三收到了,到時候來參加
      
              }
      
              //朋友類
              public class Friend
              {
                  //字段
                  public string Name;
                  //構造函數
                  public Friend(string name)
                  {
                      Name = name;
                  }
      
                  //事件處理函數,該函數符合MarryHandler委托的定義
                  public void SendMessage(object s,MarryEventArgs e)
                  {
                      //輸出通知消息
                      Console.WriteLine(e.Message);
                      //對事件做出處理
                      Console.WriteLine(this.Name + "收到了,到時候來參加");
                  }
      
              }
          }
      }
      

事件的本質

  • C#中事件是一個特殊的多路廣播委托,事件默認含有一個私有的委托變量,該變量用於保存對事件處理方法的引用,且該委托類型的變量為私有,只能從定義該事件的類中進行訪問


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM