事件委托(in)平等?

时间:2010-09-28 15:40:26

标签: c# events delegates operators inequality

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

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

感谢

2 个答案:

答案 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; 
      } 
  } 
} 

在宏观方案中,这并不重要,我不猜,但它看起来像是疏忽。