这两种notifyproperty方法有什么区别?

时间:2018-03-29 11:07:51

标签: c#

一个比另一个好吗?有没有最佳实践的notifypperty?

方法1:

 protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

方法2:

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

我主要对"([CallerMemberName]"在第二种方法中感到困惑,我不知道它做了什么,我认为它为没有呼叫添加空字符串一个字符串/ null,所以我应该主要使用第二个,因为它有更广泛的用途?

2 个答案:

答案 0 :(得分:4)

如果可选的string参数标记为[CallerMemberName],则编译器会提供调用成员的名称。所以:

public string Foo {
    get { ... }
    set { ...; OnPropertyChanged(); }
}

自动提供"Foo",为您省去显式指定成员名称带来的轻微不便。

答案 1 :(得分:3)

来自documentation

  

您可以使用CallerMemberName属性来避免将成员名称指定为被调用方法的String参数。通过使用此技术,您可以避免重命名重构不会更改String值的问题。这对以下任务特别有用:

     
      
  • 使用跟踪和诊断程序。
  •   
  • 绑定数据时实现INotifyPropertyChanged接口。此接口允许对象的属性通知绑定控件属性已更改,以便控件可以显示更新的信息。如果没有CallerMemberName属性,则必须将属性名称指定为文字。
  •