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