我想创建一个列表来存储一些事件,并通过列表将事件处理程序附加到事件中。
所以我让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]
指的是不同的对象。我想知道为什么。
如果我希望anEvent
在将处理程序附加到list[0]
时获取事件处理程序,我该怎么办?
谢谢!
答案 0 :(得分:0)
委托基本上是方法实施的合同。 有点像接口是类实现的契约。
CLI(公共语言基础结构)规范说delegates are reference types。
委托是一种可用于封装命名的引用类型 或匿名方法。委托类似于函数指针 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
}