Стандарт C #: обоснование «Не предоставлять общедоступные переменные члена события»? - PullRequest
4 голосов
/ 07 апреля 2011

Стандарт кодирования IDesign гласит: «Не предоставляйте общедоступные переменные-члены события. Вместо этого используйте средства доступа к событиям».

Я ценю, что существуют ситуации, когда средства доступа к событиям полезны (я думаю, что Control использует словарь для хранения только тех событий, которые назначены для сохранения памяти). Но какой смысл утверждать, что этот шаблонный код всегда существует?

Редактировать: явно

public event EventHandler EventName;

против.

public event EventHandler EventName { add { ... } remove { ... } }

[см. Стандарт кодирования IDesign - Стандарты кодирования - 42]

1 Ответ

3 голосов
/ 07 апреля 2011

Поля делегатов не являются событиями - они просто являются полями делегатов. Они могут (очень неправильно) проверяться, обнуляться и вызываться внешними вызывающими, поскольку противоречит разработке событий (которые, как правило, могут обрабатывать только объявивший класс).

Инкапсуляция позволяет косвенное обращение, проверку и т. Д .; все желательно. И стоимость минимальная. Это не было бы нормальным для этого, чтобы повлиять на производительность вашего кода.

Это также позволяет использовать их на интерфейсах ; поля не могут быть объявлены на интерфейсах.


Edit:

Вопрос немного неясен, но если вопрос состоит просто в полевых событиях, а не в явном добавлении / удалении с помощью участника делегата ... Тогда это глупо. Не добавляйте ненужный код. События, подобные полям, предпочтительнее, если событий недостаточно для гарантии реализации EventHandlerList.

В частности, компилятор 4.0 теперь очень разумно обеспечивает безопасность потоков (исторически это было не так).

...