有人可以解释以下代码部分的含义:
private event UserChangedHandler m_UserChanged;
public event UserChangedHandler UserChanged
{
add
{
if (m_UserChanged != value)
{
m_UserChanged += value;
}
}
}
谢谢
有人可以解释以下代码部分的含义:
private event UserChangedHandler m_UserChanged;
public event UserChangedHandler UserChanged
{
add
{
if (m_UserChanged != value)
{
m_UserChanged += value;
}
}
}
谢谢
add { }
是一个非常类似于get { }
属性的构造,除了 add 对事件起作用。将委托添加到事件时,您在此处定义自定义功能。
在这种情况下,此方法主体可防止连续重复(即您不能连续两次注册相同的方法/处理程序)。
所以在这个例子中:
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 处理程序。(感谢马修提请注意)
让我感到奇怪的是 m_UserChanged 被声明为一个事件而不仅仅是一个委托实例(这是正确的术语......我对委托感到困惑)。事件类似于简单的属性模型,因为它们本质上将底层字段包装在一对透明方法中。
根据我的理解,.Net 允许通过以下方式创建隐式(匿名?)事件和属性:
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;
}
}
}
我不认为这在宏伟的计划中并不重要,但它看起来像是一个疏忽。