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

时间:2014-03-26 14:42:34

标签: 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;不相关或多余?将框架放在一边的事件,这种微观优化是否仍然是一个起点?

3 个答案:

答案 0 :(得分:4)

通常,接口是具有语义含义而非纯粹技术含义的合同。在INotifyPropertyChanged的情况下,语义正是它听起来的样子 - 实现该接口的对象在属性发生变化时通知您。

“改变”这个词很关键。是的,许多订阅INotifyPropertyChanged事件的类可能会以这样的方式编写,即它们将“新”值与之前的值进行比较,如果它实际上没有更改,则它们不会执行任何操作。但是,这不是你应该依赖的东西 - 如果即使属性没有改变你也会触发事件,那么你的代码是不正确的。

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

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

答案 1 :(得分:1)

我认为没有必要。通常在不希望在值等于旧值时更新属性时执行此操作。在这种情况下,我这样做:

public string Prop
{
  get
  {
      return _prop;
  }

  set
  {
      if (_prop != value) 
      {
          _prop = value;
          OnPropertyChanged(()=>Prop);
      }
   }   
} 

答案 2 :(得分:1)

INotifyPropertyChanged没有标准实现,尽管大多数人/框架在基类中与您提到的方法一起实现它(使用expression来触发具有属性名称的PropertyChanged事件。

您没有提及方法OnPropertyChanged的来源(或显示实施方式),但通常使用if (_prop == value) return;来避免触发PropertyChanged事件。 value与旧值相同。

大多数人会认为这是微观优化并且不需要,但是如果你有一个热门路径,价值会经常变化,或者如果它被触发就会做很多工作,那么这可能是一个好主意。然后你可能会遇到另一个问题:P

在这种情况下,我发现很难相信该方法可以防止事件被触发,因为它不知道新值。某些特定控件可能会忽略基于事件的更新的原因可能是他们正在比较侦听端的值,但您的ViewModel无法保证这种情况。