有人可以解释以下代码部分的含义:
private event UserChangedHandler m_UserChanged;
public event UserChangedHandler UserChanged
{
add
{
if (m_UserChanged != value)
{
m_UserChanged += value;
}
}
}
感谢
答案 0 :(得分:4)
add { }
与get { }
非常相似,除了添加事件之外。在向事件添加委托时,您将在此处定义自定义功能。
在这种情况下,此方法体会阻止连续重复(即您不能连续两次注册相同的方法/处理程序)。
所以在这个例子中:
public void HandlerUserChanged(object o, UserChangedEventArgs args)
{
// some code
}
public void HandlerUserChanged2(object o, UserChangedEventArgs args)
{
// some code
}
随后:
UserChanged += HandleUserChanged;
UserChanged += HandleUserChanged;
UserChanged(this, new UserChangedEventArgs());
即使您注册了两次,方法HandleUserChanged
也只会触发一次。正常事件(没有add { }
)将调用该函数两次。
然而:
UserChanged += HandleUserChanged;
UserChanged += HandleUserChanged2;
UserChanged += HandleUserChanged;
UserChanged(this, new UserChangedEventArgs());
允许HandleUserChanged
触发两次,因为最后注册的处理程序不是添加的处理程序。事件上的==运算符适用于LAST处理程序。 (谢谢马修带来注意力)
答案 1 :(得分:0)
奇怪的是,m_UserChanged被声明为一个事件而不仅仅是一个委托实例(这是正确的术语......我对代表们感到困惑)。事件类似于简单的Property模型,因为它们基本上将一对透明方法中的底层字段包装起来。
我理解它的方式,.Net允许通过这样的方式创建implcit(匿名?)事件和属性:
public int Value { get; set;}
public event EventHandler ValueChanged;
然后创建相应的底层占位符对象以生成更像这样的内容:
private int _Value;
public int Value { get { return _Value;} set { _Value = value;}}
private EventHandler _ValueChanged;
public event EventHandler ValueChange { add { _ValueChanged += value;} remove { _ValueChanged -= value;}}
当然可以明确定义底层对象,但上面的代码示例看起来是显式和隐式事件声明之间的一点混合......看起来实际上正在完成以下内容(在幕后,原样):
private UserChangedHandler _m_UserChanged;
private event UserChangedHandler m_UserChanged { add { _m_UserChanged += value;} remove { _m_UserChanged -= value;}}
public event UserChangedHandler UserChanged
{
add
{
if (m_UserChanged != value)
{
m_UserChanged += value;
}
}
}
在宏观方案中,这并不重要,我不猜,但它看起来像是疏忽。