不必要的NotifyPropertyChanged调用会导致性能问题吗?

时间:2011-05-17 15:45:51

标签: c# wpf mvvm inotifypropertychanged

在我的新WPF应用程序中,我正在重用Model类。在该模型类中,其setter中的所有属性都会触发NotifyPropertyChanged。在我的应用程序中,我真的没有为个人财产解雇INPC的用例。 我需要知道,如果我保留当前的架构,其中每个属性在每次更改时触发INPC,它是否会导致任何性能影响?在不需要时,让个别属性触发INPC是否有意义?

4 个答案:

答案 0 :(得分:5)

一般来说,只要您运行一段不必要的代码,就可能导致性能问题。

根据经验,当您为属性编写setter而不是仅设置后备字段并引发更改事件时,应检查之前的相等,从而避免不必要的更新

例如:

public int MyInteger 
{
   get { return this._myInteger; }
   set { 
         if ( value != this._myInteger )
         {
            this._myInteger = value;
            RaiseChangedEvent("MyInteger");
         }
      }

您还应检查RaiseChangedEvent方法中的附加事件,因此如果没有侦听器,则不会抛出空引用异常,并且不会不必要地进行调用:

private void RaiseChangedEvent(string propertyName)
{
   var changedHandler = this.PropertyChanged ;
   if ( changedHandler != null )
      changedHandler(this, new PropertyChangedEventArgs( propertyName ) );
}

答案 1 :(得分:1)

如果这些对象的事件没有附加任何内容,那么应该没有太大的性能损失,尽管你仍然在执行代码,因此会有一些的区别。删除它。

答案 2 :(得分:1)

在触发PropertyChanged事件时,您应该看起来像:

private void NotifyPropertyChanged(string name) {
    if (PropertyChanged != null) {
        PropertyChanged(this, new PropertyChangedEventArgs(name));
    }
}

如果PropertyChanged为null,则表示您的事件没有附加侦听器。因此,对性能的影响很小(如果有的话)。

如果有听众,那么您需要举起活动,以便他们收到变更通知。

答案 3 :(得分:0)

INotifyPropertyChange是一个事件,它会在属性中发生任何更改(此处更改意味着值更改)时触发,这些更改与控件绑定,理想情况下它取决于在这些事件中编写的代码,否则它不是开销但它是对于您班级的每个属性都不是一个好的做法来实现INotifyPropertyChange