通常我们使用此代码:
private EventHandler _updateErrorIcons;
public event EventHandler UpdateErrorIcons
{
add { _updateErrorIcons += value; }
remove { _updateErrorIcons -= value; }
}
是否有与自动属性类似的快捷方式? 类似的东西:
public event EventHandler UpdateErrorIcons { add; remove; }
答案 0 :(得分:14)
是的。摆脱{ add; remove; }
部分和支持代表字段,你就是金色的:
public event EventHandler UpdateErrorIcons;
就是这样!
在您提出这个问题之前,我先补充一点,我甚至没想过事件的自动实现版本与属性的事件不一致。就个人而言,如果自动实现的事件按照您在问题中首次尝试的方式工作,我实际上更喜欢它。它会更加一致,它也可以作为一个心理提醒,事件不与委托字段相同,就像属性与常规字段不同。
老实说,我认为你是一个罕见的例外,你真正了解自定义语法首先。许多.NET开发人员都不清楚是否可以选择实现自己的add
和remove
方法。
更新:为了您自己的安心,我已经确认使用Reflector C#4中事件的默认实现(即,当您进入时生成的实现自动实现的路线)相当于:
private EventHandler _updateErrorIcons;
public event EventHandler UpdateErrorIcons
{
add
{
EventHandler current, original;
do
{
original = _updateErrorIcons;
EventHandler updated = (EventHandler)Delegate.Combine(original, value);
current = Interlocked.CompareExchange(ref _updateErrorIcons, updated, original);
}
while (current != original);
}
remove
{
// Same deal, only with Delegate.Remove instead of Delegate.Combine.
}
}
请注意,上述内容利用无锁同步来有效地序列化add
和remove
个调用。因此,如果您使用的是最新的C#编译器,则无需自己实现add
/ remove
甚至进行同步。
答案 1 :(得分:4)
public event EventHandler UpdateErrorIcons;
很好
你可以使用
yourObbject.UpdateErrorIcons += YourFunction;
答案 2 :(得分:2)
add {}
和remove {}
仅在需要手动处理事件连接的特殊情况下使用。我们凡人通常只使用public event EventHandler UpdateErrorIcons;
,其中“EventHandler”是首选代表。
例如:
public delegate void MyEventDelegate(object sender, string param1);
public event MyEventDelegate MyEvent;
请注意,因为如果没有任何侦听器,MyEvent为null,则需要在调用它之前检查它是否为null。执行此检查的标准方法是:
public void InvokeMyEvent(string param1)
{
MyEventDelegate myEventDelegate = MyEvent;
if (myEventDelegate != null)
myEventDelegate(this, param1);
}
此检查中的关键元素是首先制作相关对象的副本,然后仅对副本起作用。如果不是,你可以得到一个罕见的竞争条件,其中另一个线程在你和你的电话之间解开。