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