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的功能 - 这意味着你可以拥有大量的 没有浪费大量内存和变量的事件 通常只有空值。
问题:
答案 0 :(得分:2)
首先,这个“地图事物”只是Dictionary<object, EventHandler>
。它本身就是类的一个字段,但是当它被创建时,它将不包含任何元素,因此不会占用太多内存(只是内部结构的一些开销)。随着订阅事件的事件被添加到字典中,我们开始使用更多的内存。
考虑一个包含50个事件的类,我们只使用5个事件,在一个简单的场景中,将为该类的每个实例创建50个代理。使用字典进行存储时,每个实例将有5个代理。
P.S。这与WPF中的依赖对象/属性背后的原理相同。