写一个活动的简短方法?

时间:2011-02-10 16:25:49

标签: c# events

通常我们使用此代码:

    private EventHandler _updateErrorIcons;
    public event EventHandler UpdateErrorIcons
    {
        add { _updateErrorIcons += value; }
        remove { _updateErrorIcons -= value; }
    }

是否有与自动属性类似的快捷方式? 类似的东西:

   public event EventHandler UpdateErrorIcons { add; remove; }

3 个答案:

答案 0 :(得分:14)

是的。摆脱{ add; remove; }部分和支持代表字段,你就是金色的:

public event EventHandler UpdateErrorIcons;

就是这样!

在您提出这个问题之前,我先补充一点,我甚至没想过事件的自动实现版本与属性的事件不一致。就个人而言,如果自动实现的事件按照您在问题中首次尝试的方式工作,我实际上更喜欢它。它会更加一致,它也可以作为一个心理提醒,事件与委托字段相同,就像属性与常规字段不同。

老实说,我认为你是一个罕见的例外,你真正了解自定义语法首先。许多.NET开发人员都不清楚是否可以选择实现自己的addremove方法。


更新:为了您自己的安心,我已经确认使用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.
    }
}

请注意,上述内容利用无锁同步来有效地序列化addremove个调用。因此,如果您使用的是最新的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);
}

此检查中的关键元素是首先制作相关对象的副本,然后仅对副本起作用。如果不是,你可以得到一个罕见的竞争条件,其中另一个线程在你和你的电话之间解开。