2

有人可以解释以下代码部分的含义:

private event UserChangedHandler m_UserChanged;
public event UserChangedHandler UserChanged
{
  add
  {
      if (m_UserChanged != value)
      {
        m_UserChanged += value;
      }
  }
}

谢谢

4

2 回答 2

4

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 处理程序。(感谢马修提请注意)

于 2010-09-28T15:51:30.403 回答
0

让我感到奇怪的是 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; 
      } 
  } 
} 

我不认为这在宏伟的计划中并不重要,但它看起来像是一个疏忽。

于 2010-09-28T18:15:19.570 回答