Ответ 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
самостоятельно даже для синхронизации.