c# - 如果值与当前属性相同,INotifyPropertyChanged 标准实现是否包含空操作?

标签 c# .net wpf inotifypropertychanged

在代码审查期间,建议按如下方式实现我的 INotifyPropertyChanged:

public string Prop
{
  get{return _prop;}
  set
  {
    if(_prop == value) return;
    _prop = value;
    OnPropertyChanged(()=>Prop);
  }
} 

有问题的行是:

if(_prop == value) return;

我的问题是这是否真的有必要?我刚遇到一个情况,如果组合框的 OnPropertyChanged 返回相同的引用,则框架会忽略它(不过我不确定这是否全面正确?)。

如果没有真正产生影响,我个人认为没有必要添加额外的代码困惑。 INotifyPropertyChanged 的框架实现是否使 if (_prop == value) return; 无关紧要或多余?除了框架实现之外,这种微优化是否有必要作为起点?

最佳答案

通常,接口(interface)是具有语义意义而非纯技术意义的契约。在 INotifyPropertyChanged 的​​情况下,语义含义正是它听起来的样子——实现该接口(interface)的对象会在属性发生更改时通知您。

“改变”这个词是关键。是的,许多订阅 INotifyPropertyChanged 事件的类可能以这样的方式编写,即它们将"new"值与之前的值进行比较,如果它实际上没有改变,它们就什么都不做。不过,这不是您应该依赖的东西 - 如果您在属性没有更改时触发事件,那是您的代码不正确。

如果客户端代码确实执行自己的检查以判断该值是否实际发生了变化,那就是它们非常谨慎,但它们不是必需的,也不应期望它们这样做。

简短版本:是的,请检查您的 INotifyPropertyChanged 实现。不要指望客户端代码为您执行检查。

关于c# - 如果值与当前属性相同,INotifyPropertyChanged 标准实现是否包含空操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22664459/

相关文章:

c# - 如何在网站项目的页面上使用其他C#源文件?

c# - 在 C# 中,在何处使用字符串 [] 与列表 <string>

c# - 如何在 WPF MVVM 方法中将结构绑定(bind)到文本框控件

c# - "Table does not contain primary key"

c# - 在窗体调整大小时调整控件大小

.net - ADO 与数据集和数据表

WPF - 从模式窗口中删除系统菜单图标,但不是主应用程序窗口

wpf - WPF 中的双重加载事件

c# - 获取公共(public)/外部 IP 地址?

.net - 检查字符串是否不等于任何字符串列表