2009-09-25 7 views
13

Какая цель защищают или закрывают (нестатические) события в .NET?Какие существуют варианты использования для нестатических частных или защищенных событий?

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

У вас был прецедент, прежде чем это ясно продемонстрирует необходимость или преимущество для нестатического защищенного или частного события?

+0

Интересует сами ответы. Сделайте свой случай! –

ответ

6

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

Edit:

Позвольте мне привести пример ...

Допустим, вы пишете контроль типа сетки, а внутри этого элемента управления, скорее всего, есть куча содержащихся классов, которые создаются динамически Например, строки, столбцы, заголовки и т. Д. Говорят, что вы хотите уведомить эти содержащиеся классы о том, что что-то, о чем они заботятся, произошло, скажем, изменение скиннинга или что-то в этом роде, то, что вам не обязательно нужно выставлять в качестве события в сетку пользователи, это то, где частные события удобны, просто есть один или два обработчика, и когда вы создаете каждый экземпляр своей строки или столбца или любого другого, добавляете обработчик, так как иначе вам просто нужно написать вам r собственный механизм наблюдателя, не сложно, но почему, когда вам это не нужно, и вы можете просто использовать события многоадресной рассылки.

+0

Чтобы компонент работал, не должны ли отдельные элементы иметь публичные (или, по крайней мере, внутренние) события? Как «составной компонент» собирается подписаться на частное или защищенное событие на его части? –

+0

Скрытые классы просто таковы, что они входят в сферу действия класса, определяющего частное событие. –

+0

О, ты думаешь конкретно о компоненте, определяемом как вложенный класс? –

7

Вот немного странный, но реальный сценарий, который я реализовал один раз. У вас есть генерируемые машиной и созданные пользователем половинки частичного класса. Полученная машиной половина содержит код, который хочет сообщить генерируемую пользователем половину при возникновении какого-либо события. Но половина, созданная пользователями, может ничего не делать, или, возможно, это будет сделано довольно много. Кажется грубым порожденной машиной половиной требовать, чтобы генерируемая пользователем половина реализовала конкретный метод, чтобы обрабатывать сообщение, которое они не интересуют при прослушивании.

Для решения этой проблемы порожденная машиной половина может срабатывать при закрытом событии. Если пользовательская половина заботится, он может подписаться на событие. Если нет, это может игнорировать его.

Этот сценарий теперь более элегантно рассмотрен частичными методами на C# 3, но это не было вариантом в тот же день.

+0

Очень интересно, хотя я согласен с частичными методами, вероятно, более интересным вариантом на текущей платформе. –

+0

Кстати, когда мы впервые спроектировали эту архитектуру, VB фактически не поддерживал прослушивание ваших собственных событий. Я считаю, что сейчас. –

1

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

0

К сожалению перетащить старую нить, но я использую частные мероприятия с безнаказанностью в одном из моих проектов, и лично я считаю, что это хороший способ решения проблемы дизайна:

Вот сокращенный код:

public class MyClass 
{ 
    private event EventHandler _myEvent; 

    public ExternalObject { get; set; } 

    public event EventHandler MyEvent 
    { 
    add 
    { 
     if (_myEvent.GetInvocationList().Length == 0 && value != null) 
     ExternalObject.ExternalEvent += HandleEvent; 
     _myEvent+= value; 
    } 
    remove 
    { 
     _myEvent-= value; 
     if (_myEvent.GetInvocationList().Length == 0) 
     ExternalObject.ExternalEvent -= HandleEvent; 
    } 
    } 

    private void HandleEvent(object sender, EventArgs e) 
    { 
    _myEvent.Raise(this, EventArgs.Empty); // raises the event. 
    } 
} 

в принципе, MyEvent только когда-либо поднимавшихся в обработчик события ExternalObject.ExternalEvent, так что если нет никаких обработчиков для MyEvent тогда мне не нужно прикрепить обработчик внешнего события, ускоряя код немного, сохранив стек кадров.

0

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

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

Я могу определенно увидеть пример использования в каталоге, таком как система хранения, где каждый каталог должен распространять свою последнюю измененную дату на родителя, например.

Смежные вопросы