Короткий способ написать событие? - PullRequest
11 голосов
/ 10 февраля 2011

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

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

Существует ли такой же ярлык, как с автоматическими свойствами?Что-то вроде:

   public event EventHandler UpdateErrorIcons { add; remove; }

Ответы [ 3 ]

15 голосов
/ 10 февраля 2011

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

public event EventHandler UpdateErrorIcons;

Вот и все!

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

Честно говоря, я думаюВы редкое исключение, когда вы на самом деле знали о пользовательском синтаксисе first .Многие разработчики .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 самостоятельно даже для синхронизации.

5 голосов
/ 10 февраля 2011
public event EventHandler UpdateErrorIcons; 

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

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

yourObbject.UpdateErrorIcons += YourFunction;
2 голосов
/ 10 февраля 2011

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);
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...