C# 这两种notifyproperty方法之间的区别是什么?

C# 这两种notifyproperty方法之间的区别是什么?,c#,C#,一个比另一个好吗?是否有最佳实践 方法1: protected virtual void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } 方法2: protected virtual void OnPropertyChanged([Caller

一个比另一个好吗?是否有最佳实践

方法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的调用中添加了一个空字符串,所以我应该主要使用第二个,因为它有更广泛的用途吗?

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

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

如果可选的
字符串
参数标记为
[CallerMemberName]
,编译器将提供调用成员的名称。因此:

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

自动提供
“Foo”
,为您节省了显式指定成员名称的一些小麻烦。

这可以在3秒钟内用谷歌搜索。因此,您使用哪一个都不重要,只是偏好的问题?@JsonDork好吧,如果我使用第一个版本,那么我显示的代码将无法编译…但是如果我使用了
OnPropertyChanged(“Foo”);
OnPropertyChanged(nameof(Foo))
那么是的,这完全取决于偏好——但偏好是:你喜欢这个方便的特性吗?我明白了,使用第一个不会编译的特性不是更好吗?因为你不总是希望它们输入正确的字符串吗?@JsonDork如果我使用第二个版本,什么也不做:它们总是是的,编译器不会把调用方的名字弄错,但我可能会弄错,尤其是如果我重新命名某个东西,我明白了。现在我明白了,这是一个偏好问题,但第二个是高级编码实践。非常感谢Marc!