Я использую C # 3.0.Следуя стандартному шаблону событий, у меня есть:
public event EventHandler<EventArgs> SomeEventHappens;
protected virtual void OnSomeEventHappens(EventArgs e)
{
if (SomeEventHappens != null)
{
SomeEventHappens(this, e);
}
}
private object _someProperty;
public object SomeProperty
{
get
{
return _someProperty;
}
private set
{
if (_someProperty == value)
{
return;
}
OnSomeEventHappens(EventArgs.Empty);
_someProperty = value;
}
}
В моем классе Я хотел бы предпринять некоторые действия, когда SomeProperty
изменится.На мой взгляд, у меня есть 3 варианта:
1) Делайте вещи в моем SomeProperty
сеттере.Что-то делает мне неправильный способ сделать это, так как я пытаюсь присоединиться к философии всего, должен делать одно и делать это хорошо.Кажется, что вбивание вещей в сеттер идет против этого или, по крайней мере, имеет склонность к.
2) Делайте вещи в OnSomeEventHappens
.Опять же, кажется, немного против того, чтобы держать это в простых частях.Кроме того, если этот метод будет переопределен, он может потерять функциональность, если разработчик не вызовет базовый метод.
3) Пусть класс подпишется на SomeEventHappens
.Мне кажется, что это правильный выбор с точки зрения инкапсуляции, и кажется довольно чистым.Опять же, возможные последствия, если переопределено OnSomeEventHappens
.
Может быть, есть что-то более элегантное?Я не могу выбрать между вариантом 2 и 3, и мне любопытно, какова наилучшая практика.Возможно, самое безопасное место в установщике свойств.
Мысли?
Обновление: Спасибо за замечательные комментарии и ответы ниже.Я узнал, что это нормально, когда класс подписывается на свои собственные события, хотя в моем случае я склонен не делать этого из-за накладных расходов.Я подумал о поведении потенциальных переопределений моих виртуальных методов и о том, что именно я хочу, чтобы произошло.
В моем случае, в действительности, я не хочу, чтобы события возникали без установки свойства,Поскольку ответы, приведенные ниже, направили мой мыслительный процесс, я думаю, что могу выбрать вариант 1 из-за меньших накладных расходов, уменьшенного риска ненадлежащего поведения со стороны наследников, и это, как правило, лучше для меня.Еще раз спасибо!