“类似田野的事件”和“一般事件”的澄清?

时间:2013-05-04 08:06:44

标签: c# .net events

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

因此,事件(public event EventHandler MyEvent;)之类的字段可能会转换为:(取自here

private EventHandler _myEvent;

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

注意私人备份字段。

但是,Jon评论部分)更正了我,一般事件没有备用字段。类似的东西:

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

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

注意 - 没有备用字段。

然后他说winform的行为是这样的:

  

例如,在有很多事件但只有一个事件的情况下   很少有人可能会订阅,你可以从某个键获得一张地图   将事件描述给当前正在处理它的代理。这是   Windows Forms的功能 - 这意味着你可以拥有大量的   没有浪费大量内存和变量的事件   通常只有空值。

问题:

  • winform如何使用此 map 事件来公开没有任何备份字段(委托类型)的事件

1 个答案:

答案 0 :(得分:2)

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

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

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