【发布时间】:2017-02-17 06:35:19
【问题描述】:
在实现INotifyPropertyChanged时,应该只在n != value时调用PropertyChanged,还是应该因为set被调用才调用?
我在这里寻找的是行业标准建议(如果存在这样的东西),哪些实施更好以及为什么。
示例 1 - 说明了一个“愚蠢”的事件引发策略
class Person : INotifyPropertyChanged
{
private string name;
public event PropertyChangedEventHandler PropertyChanged;
public string Name
{
get
{
return name;
}
set
{
name = value;
PropertyChanged(this, new PropertyChangedEventArgs(nameof(Name)));
}
}
}
示例 1 的用例
Person p = new Person();
p.Name = "John"; // ProperyChanged fired
p.Name = "John"; // ProperyChanged fired
示例 2 - 说明了一个“聪明”的事件引发策略
class Person : INotifyPropertyChanged
{
private string name;
public event PropertyChangedEventHandler PropertyChanged;
public string Name
{
get
{
return name;
}
set
{
if(name != value)
{
name = value;
PropertyChanged(this, new PropertyChangedEventArgs(nameof(Name)));
}
}
}
}
示例 2 的用例
Person p = new Person();
p.Name = "John"; // ProperyChanged fired
p.Name = "John"; // ProperyChanged ignored as name == value
注意示例 2 中的 if(name != value),它只允许更改值,以及当传入值与现有值不匹配时的 ProperyChanged 事件。
【问题讨论】:
-
这就是编码的伟大之处:你可以让它做任何你想做的事情。
-
我认为这可能是那些“视情况而定”的答案之一。
-
我只是想知道两者之间是否有“推荐”的方法,为什么?
-
您已经列出了两个选项和第二个版本的优点。这完全取决于您的用例。您很可能想要获取每个事件,就像您可能只想要真正的更改一样。
-
@JeroenVannevel 我知道这是一个“取决于”的答案。我只是从性能的角度想知道,因为示例 1 似乎如果对象被频繁击中可能会变得有点贵。