[英]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);
}
}
不委托引用類型嗎? 似乎eventhandler
和list[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.