将事件处理程序附加到存储在列表中的事件

时间:2017-09-02 07:23:25

标签: c# delegates

我想创建一个列表来存储一些事件,并通过列表将事件处理程序附加到事件中。

所以我让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]指的是不同的对象。我想知道为什么。

如果我希望anEvent在将处理程序附加到list[0]时获取事件处理程序,我该怎么办?

谢谢!

1 个答案:

答案 0 :(得分:0)

委托基本上是方法实施的合同。 有点像接口是类实现的契约。

CLI(公共语言基础结构)规范说delegates are reference types

  

委托是一种可用于封装命名的引用类型   或匿名方法。委托类似于函数指针   C ++;但是,代表们是类型安全且安全的。适用于   代表们,请参阅代表和通用代表。

查看this问题,并查看that一个。

由于调试原因,我已将方法转换为非匿名方法

 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
}