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
的默认实现实际上包括同步。