簡體   English   中英

將事件處理程序附加到列表中存儲的事件

[英]Attach an event handler to an event stored in a list

我要創建一個存儲一些事件的列表,並通過列表將事件處理程序附加到事件。

因此,我制作了一個List<dele>將事件anEvent添加到其中,然后嘗試將事件處理程序附加到該事件,但是最后anEvent仍然沒有附加事件處理程序,程序輸出True。 但是存儲在list[0]的委托確實得到了lambda表達式。

 public delegate void dele();

class Program
{
   static event dele anEvent;
    static void Main(string[] args)
    {
        List<dele> list=new List<dele>();
        list.Add(anEvent);
        list[0]+=()=>{Console.WriteLine("BEEP!");};
        Console.WriteLine(anEvent==null);
    }
}

不委托引用類型嗎? 似乎eventhandlerlist[0]引用了不同的對象。 我想知道為什么。

如果我希望在將處理程序附加到list[0]時使anEvent獲取事件處理程序,該怎么辦?

謝謝!

委托基本上是方法實現的合同。 像接口一樣的Kinda是類實現的契約。

CLI(通用語言基礎結構)規范指出, 委托是引用類型

委托是一種引用類型,可用於封裝命名方法或匿名方法。 委托類似於C ++中的函數指針。 但是,委托是類型安全的。 有關委托的應用程序,請參見委托和通用委托。

看看這個問題,也看看那個問題。

由於調試原因,我已將該方法轉換為非匿名方法

 public delegate void dele();
 public static event dele anEvent;

  static void Main(string[] args) {
      List<dele> list = new List<dele>();
      list.Add(anEvent);
      list[0] += Dele;
      list[0].Invoke(); //this actually gets invoked and does not throw!
      anEvent = list[0];
      Console.WriteLine(anEvent == null); //the output is false
      anEvent.Invoke(); // this also gets s invoked and does not throw
  }

private static void Dele() { //this gets invoked 2 times as expected
  Console.WriteLine("Beep"); // this gets printed after invoking the event
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM