C# 写事件的捷径?
通常我们使用以下代码:C# 写事件的捷径?,c#,events,C#,Events,通常我们使用以下代码: private EventHandler _updateErrorIcons; public event EventHandler UpdateErrorIcons { add { _updateErrorIcons += value; } remove { _updateErrorIcons -= value; } } 是否有类似自动属性的快捷方式? 比如: public event EventHa
private EventHandler _updateErrorIcons;
public event EventHandler UpdateErrorIcons
{
add { _updateErrorIcons += value; }
remove { _updateErrorIcons -= value; }
}
是否有类似自动属性的快捷方式?
比如:
public event EventHandler UpdateErrorIcons { add; remove; }
是的。去掉
{add;remove;}
部分和backing delegate字段,您将获得金牌:
public event EventHandler UpdateErrorIcons;
就这样
让我补充一点,在你问这个问题之前,我甚至没有想到事件的自动实现版本与属性的版本不一致。就我个人而言,如果自动实现的事件能够像您在问题中第一次尝试的那样工作,我实际上更愿意这样做。它将更加一致,并且还可以作为一种心理提醒,事件与委托字段不同,就像属性与常规字段不同一样
老实说,我认为你是一个罕见的例外,你实际上知道自定义语法第一。许多.NET开发人员根本不知道有一个选项可以实现自己的add
和remove
方法
更新:为了您自己的安心,我已经使用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
,即使是为了同步
public event EventHandler UpdateErrorIcons;
很好
你可以用
yourObbject.UpdateErrorIcons += YourFunction;
add{}
和remove{}
仅在需要手动处理事件连接的特殊情况下使用。我们这些凡人通常只使用公共事件处理程序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);
}
此检查中的一个关键要素是首先制作相关对象的副本,然后仅处理副本。否则,您可能会遇到一种罕见的争用情况,即另一个线程在您的If和您的呼叫之间脱钩。和支持字段。(事实上,OP,你会发现很多人甚至不知道
add
和remove
事件访问器。)我们在一些事件中使用add&remove进行同步。@Carra:根据你使用的C编译器的版本,你可能不必担心:很高兴知道。我记得当我们还在2.0框架上的时候,我读过关于事件线程安全的最佳实践。这真的很有趣,大多数人甚至从来没有听说过扩展代码:)是的,尽管我见过有人这样做,但我从来没有亲自使用过,编译器后来补充道。是的,我们通常会在以后使用它来添加同步。@卡拉:除非我弄错了,在.NET framework的最新版本中,add
和remove
的默认实现实际上包括同步。