Подтвердить что ты не робот

Что такое [NotifyPropertyChangedInvocator] в С# при реализации INotifyPropertyChanged?

Я вижу два типа реализации INotifyPropertyChanged

  • Первый:

    public abstract class ViewModelBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
    
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
  • Второй:

    public abstract class ViewModelBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
    
        [NotifyPropertyChangedInvocator]
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
    

Во втором вы видите дополнительный атрибут [NotifyPropertyChangedInvocator] для метода OnPropertyChanged

В моем случае оба ведут себя одинаково, но что, почему и когда использовать этот [NotifyPropertyChangedInvocator], каковы преимущества этого? Я искал в Интернете, но не нашел хорошего ответа.

4b9b3361

Ответ 1

Это атрибут Resharper из их аннотаций, предназначенный для предупреждения, тогда ваш код выглядит подозрительно :)
Учти это:

public class Foo : INotifyPropertyChanged 
{
     public event PropertyChangedEventHandler PropertyChanged;

     [NotifyPropertyChangedInvocator]
     protected virtual void NotifyChanged(string propertyName) { ... }

     private string _name;
     public string Name {
       get { return _name; }
       set { 
             _name = value; 
             NotifyChanged("LastName");//<-- warning here
           } 
     }
   }

С [NotifyPropertyChangedInvocator] attribut на NotifyChanged методе Resharper даст вам предупреждение, что вы вызываете метод с (предположительно) неправильным значением.

Поскольку Resharper теперь знает, что метод должен вызываться для уведомления об изменениях, он поможет вам преобразовать обычные свойства в свойства с уведомлением об изменениях: enter image description here
Преобразование это в это:

public string Name
{
  get { return _name; }
  set
  {
    if (value == _name) return;
    _name = value;
    NotifyChange("Name");
  }
}



Этот пример [NotifyPropertyChangedInvocator] из документации по [NotifyPropertyChangedInvocator] найденной здесь:
enter image description here