事件委托(不)平等?
-
26-09-2019 - |
题
有人能解释下面的代码部分的含义是:
private event UserChangedHandler m_UserChanged;
public event UserChangedHandler UserChanged
{
add
{
if (m_UserChanged != value)
{
m_UserChanged += value;
}
}
}
感谢
解决方案
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
火灾两次,因为最后注册的处理程序是不是曾经被添加的一个。对事件的==操作符的工作原理上的最后一个处理。的(三江源马修用于使该给注意)强>
其他提示
这令我奇怪的是,m_UserChanged被声明为一个事件,而不仅仅是一个委托实例(是正确的术语...我会感到困惑W /代表)。事件是类似于在它们基本上由对透明的方法内包裹底层字段的简单属性模型。
我的理解是,.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;
}
}
}
这其实并不重要,在事物的宏伟计划,我不用猜,但它看起来像一个监督。
不隶属于 StackOverflow