Когда должно быть запущено событие «свойство изменено»?

2

Уместно ли запускать событие "свойство изменено", когда фактическое значение свойства не изменяется?

public int SomeProperty
{
    get { return this.mSomeProperty; }
    set
    {
        this.mSomeProperty = value;
        OnPropertyChanged(new PropertyChangedEventArgs("SomeProperty"));
    }
}

Это вызовет событие, даже если новое значение будет идентично старому значению. Это плохая практика?

  • 0
    Почему у вас есть возвращение; в вашем сеттере?
  • 0
    Я удалил его - стандарт кодирования на работе требует оператора возврата в конце каждой функции.
Показать ещё 1 комментарий
Теги:
events

3 ответа

5
Лучший ответ

Лучшая практика - не бросать событие, если значение не изменилось.

В вашем случае свойство является просто "int", поэтому это просто простая проверка равенства. Если ваше свойство было объектом в его собственном праве, есть еще несколько случаев, чтобы рассмотреть

  • Вы снова установите тот же экземпляр - Без изменений свойств

  • Вы устанавливаете другой экземпляр с разными значениями - выбросите изменение свойства

  • Вы устанавливаете другой, но "равный" экземпляр (т.е. два разных объекта имеют один и тот же набор значений и могут считаться эквивалентными с точки зрения вашего приложения). Выбросьте изменение свойства.

Последний вопрос подлежит обсуждению... действительно ли свойство действительно изменилось, когда все его атрибуты одинаковы? Если кто-то использует это изменение свойства, чтобы подписаться на изменения в подклассе, им нужно будет знать, чтобы отказаться от подписки из старого класса и подписаться на новый. Поэтому я ошибаюсь на стороне объявления об изменении.

4

Если у вас было событие с именем PropertySetterAccessed, тогда было бы уместно его запустить, когда значение не изменится. Однако ваше событие называется PropertyChanged, поэтому его следует запускать только тогда, когда это произошло. Если ваши события/методы/классы и т.д. Не делают "то, что они говорят на олове", вы создаете кошмар для обслуживания для кого-то.

4

Нет, не запускайте событие, если базовое значение фактически не изменилось.

Обычно вы кодируете Setter таким образом, чтобы он даже не пытался изменить базовое значение, если оно фактически не отличается.

  • 0
    Стандартная идиома состоит в том, чтобы проверить, совпадает ли значение с полем, лежащим в основе свойства, и сразу же вернуть его. В противном случае поле обновляется, и событие инициируется.
  • 0
    Это то, что я пытался сказать ..;)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню