Короткий способ написать мероприятие?

Обычно мы используем этот код:

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

Есть ли аналогичный ярлык, например, с автоматическими свойствами? Что-то вроде:

   public event EventHandler UpdateErrorIcons { add; remove; }

Ответ 1

Угу. Избавьтесь от части { add; remove; } и поля делегирования поддержки, и вы будете золотыми:

public event EventHandler UpdateErrorIcons;

Что это!

Позвольте мне добавить, что перед тем, как вы задали этот вопрос, я даже не подумал о том, что автоматически реализованная версия событий не соответствует свойствам свойств. Лично я бы предпочел, если бы автоматизированные события работали так, как вы впервые попытались в своем вопросе. Это было бы более последовательным, и это также послужило бы напоминанием о том, что события не идентичны полям делегирования, так же как свойства не идентичны регулярным полям.

Честно говоря, я думаю, что вы редкое исключение, где вы действительно знали о пользовательском синтаксисе. Многие разработчики .NET понятия не имеют возможности реализовать свои собственные методы add и remove вообще.


Обновить. Только для вашего собственного спокойствия я подтвердил использование Reflector, что значение по умолчанию реализация событий на С# 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. Поэтому, если вы используете последний компилятор С#, вам не нужно выполнять add/remove самостоятельно даже для синхронизации.

Ответ 2

public event EventHandler UpdateErrorIcons; 

просто отлично

вы можете использовать

yourObbject.UpdateErrorIcons += YourFunction;

Ответ 3

add {} и remove {} используются только в особых случаях, когда вам нужно вручную обрабатывать события. Обычно простые смертные просто используют public event EventHandler UpdateErrorIcons;, где "EventHandler" является предпочтительным делегатом.

Например:

public delegate void MyEventDelegate(object sender, string param1);
public event MyEventDelegate MyEvent;

Обратите внимание, что поскольку MyEvent имеет значение NULL, если у него нет слушателей, вам нужно проверить, является ли оно нулевым до его вызова. Стандартный метод для этой проверки:

public void InvokeMyEvent(string param1)
{
    MyEventDelegate myEventDelegate = MyEvent;
    if (myEventDelegate != null)
        myEventDelegate(this, param1);
}

Ключевым элементом в этой проверке является сначала сделать копию рассматриваемого объекта, а затем работать только с копией. Если нет, вы можете получить редкое состояние гонки, когда другая цепочка будет отцепляться между вашим и вашим вызовом.