1

Afield-like-event是一种同时声明委托变量和事件的方式。

因此,像 event( public event EventHandler MyEvent;) 这样的字段可能会转换为:(取自这里

private EventHandler _myEvent;

public event EventHandler MyEvent
{
    add
    {
        lock (this)
        {
            _myEvent += value;
        }
    }
    remove
    {
        lock (this)
        {
            _myEvent -= value;
        }
    }        
}

注意私人备份字段。

然而,乔恩评论部分)纠正了我,一般事件没有备用字段。就像是 :

 public event EventHandler MyEvent
    {
        add
        {
            Console.WriteLine ("add operation");
        }

        remove
        {
            Console.WriteLine ("remove operation");
        }
    }      

注意 - 没有备份字段。

但后来他说 winform 的行为是这样的:

例如,在有很多事件但只有少数可能被订阅的情况下,您可以有一个从描述事件的某个键到当前处理它的委托的映射。这就是 Windows 窗体所做的 - 这意味着您可以拥有大量事件,而不会因为通常只有空值的变量而浪费大量内存。

问题 :

  • winform 如何在没有任何备份字段(委托类型)的情况下使用此地图事物来公开事件
4

1 回答 1

2

首先,这个“地图的东西”只是一个Dictionary<object, EventHandler>. 它本身是类的一个字段,但是当它被创建时,它将不包含任何元素,因此不会占用太多内存(只是其内部结构的一些开销)。随着事件被订阅,委托被添加到字典中,我们开始使用更多的内存。

考虑一个有 50 个事件的类,我们只使用 5 个事件,在一个简单的场景中,将为该类的每个实例创建 50 个委托。当使用字典进行存储时,每个实例将有 5 个委托。

PS 这与 WPF 中的依赖对象/属性背后的原理相同。

于 2013-05-04T08:21:57.260 回答