Всегда ли резервное поле события, сгенерированного компилятором, будет использовать то же имя, что и событие?C#

Место общения программистов C#
Ответить
Anonymous
 Всегда ли резервное поле события, сгенерированного компилятором, будет использовать то же имя, что и событие?

Сообщение Anonymous »

C# позволяет нам создавать собственные средства доступа к событиям.

Код: Выделить всё

Action _custom;
public event Action Custom
{
add { _custom = (Action)Delegate.Combine( _custom, value ); }
remove { _custom = (Action)Delegate.Remove( _custom, value ); }
}
Если вы их не укажете, компилятор создаст их за вас. Спецификация языка C#:


При компиляции события, подобного полю, компилятор автоматически создает
хранилище для хранения делегата и создает средства доступа для события, которые
добавляют или удаляют обработчики событий в поле делегата.


Декомпилированный исходный код с использованием dotPeek для простое публичное событие Action Public; выглядит так следует:

Код: Выделить всё

  private Action Public;

public event Action Public
{
add
{
Action action = this.Public;
Action comparand;
do
{
comparand = action;
action = Interlocked.CompareExchange(
ref this.Public, comparand + value, comparand);
}
while (action != comparand);
}
remove
{
Action action = this.Public;
Action comparand;
do
{
comparand = action;
action = Interlocked.CompareExchange(
ref this.Public, comparand - value, comparand);
}
while (action != comparand);
}
}
Примечательно, что поле и событие используют одно и то же имя. Это привело некоторых людей к выводу, что информацию о резервном поле во время отражения можно найти, выполнив поиск поля в классе с тем же именем, что и у события. Я реализовал это следующим образом:

Код: Выделить всё

public static FieldInfo GetFieldInfo( this EventInfo eventInfo )
{
Contract.Requires( eventInfo != null );

return eventInfo.DeclaringType.GetField(
eventInfo.Name,
BindingFlags.DeclaredOnly | BindingFlags.Instance |
BindingFlags.Public | BindingFlags.NonPublic );
}
Это работает, но возникает вопрос: Всегда ли гарантируется, что резервное поле события, сгенерированного компилятором, будет использовать то же имя, что и событие?

Невозможно создать собственные средства доступа к событиям, которые обращаются к делегату с тем же именем с помощью Visual Studio. В результате появляется сообщение: "Член с таким же именем уже объявлен". Мне интересно, можете ли вы сделать вывод, что любое событие, для которого нет резервного делегата с таким же именем, является событием с настраиваемым средства доступа.

Подробнее здесь: https://stackoverflow.com/questions/984 ... to-use-the
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»