如果分配了相同的值,setter是否应该立即返回?

And*_*nea 13 c# setter properties inotifypropertychanged

在实现INotifyPropertyChanged的类中,我经常看到这种模式:

    public string FirstName
    {
        get { return _customer.FirstName; }
        set
        {
            if (value == _customer.FirstName)
                return;

            _customer.FirstName = value;

            base.OnPropertyChanged("FirstName");
        }
    }
Run Code Online (Sandbox Code Playgroud)

准确的线条

            if (value == _customer.FirstName)
                return;
Run Code Online (Sandbox Code Playgroud)

困扰我.我经常这样做,但我不确定它是否需要也不好.毕竟,如果调用者分配了相同的值,我不想重新分配该字段,特别是,通知我的订阅者,该属性已经更改,而在语义上它没有.

除了通过释放UI来更新屏幕/ what_medium上可能看起来相同的东西而保存一些CPU/RAM /等,除了我们获得了什么?

有些人可以通过重新分配财产上的相同价值来强制刷新(不是说这会是一个好的做法)吗?

我们应该这样做还是不应该这样做?

为什么?

And*_*are 10

是的,当消费者设置的属性值等于已经持久的值时,应立即返回.

首先,没有理由在财产的设定者中浪费任何时间或资源 - 价值已经设定,因此不需要进一步的行动.OnPropertyChanged如果存储在属性的支持字段中的值没有改变,也不应该调用- 当值已经改变而不是在调用属性的setter时,该方法将被引发.

然而,所有这一切 - 如果安装者没有打电话给OnPropertyChanged我,就不会费心去检查价值.如果是一个简单的setter,它只设置了后备字段的值而没有别的,那么总是设置值而不是先检查然后设置值会更快.仅当属性的setter具有不应触发的额外逻辑或可能导致不必要的性能损失时才使用此模式.

  • 我想我不同意你的#2是真的.取决于正在做什么.比较两个字符串比设置字符串的引用要昂贵得多.此外,即使它们不同,您也始终添加处理. (2认同)

kem*_*002 7

或者你可以这样做:

   set
    {
        if (value != _customer.FirstName)
       {

           _customer.FirstName = value;

          base.OnPropertyChanged("FirstName");
       }
    }
Run Code Online (Sandbox Code Playgroud)

无需多个返回路径.

为了进一步回答你的问题,我不会强制更新属性,如果它被相同的值覆盖.真的没有意义,因为你可能不会从中获得任何好处.(我可以看到每次有人尝试更新值时都要跟踪的实例.)

  • 无需增加嵌套.:) (4认同)