2017-02-22 132 views
3

我正在重构我们的一些项目,以便与我们的客户之一重新使用,我希望能够理智地检查重写其中一个属性设置者的决定。此属性设置器中的条件是否有效?

我已经看到了这在执行我们的代码库几次,但因为它是由一个开发谁不再在这里工作,我不能问他这件事。

它去如下:

private double _myProperty; 

public double MyProperty 
{ 
    get { return _myProperty; } 
    set 
    { 
     if (!(Math.Abs(_myProperty - value) < double.Epsilon)) 
     { 
      _myProperty = value; 
      OnPropertyChanged(); 
     } 
    } 
} 

我很熟悉,写属性setter的语法如下:如果我丢失

if (value != _myProperty) 

但在上面第一个例子我一直想知道一些东西。我知道Math.Abs​​计算给了我'价值'和'_myProperty'的当前值之间的差异,但为什么与double.Epsilon进行比较呢?根据IntelliSense和MSDN,double.Epsilon“代表大于零的最小正双倍值”。所以肯定是比较可以很容易为:

if (Math.Abs(_myProperty - value) > 0) 

是以前开发商只是被不必要地复杂化,还是我失去了C#的一些小的细微差别我还没有介绍吗?

回答

1

赔率是他们意思是要做的就是使用double.Epsilon以外的一些Epsilon值。如你所指出的,double.Epsilon在于double可以表示最小的值,并且没有两个不同双打可以比double.Epsilon更接近,并且作为结果,其代码是功能上等同于只是检查如果该差值等于零,这在功能上是完全相同,只是做两个双打定期平等检查。

逻辑背后的一般理念是让数字相互“足够接近”以便被认为是相等的,其中“足够接近”是一个基于数字的有效数字的值处理。他们打算使用SomeBusinessObject.Epsilon来代表你正在使用的值的精确度,或者他们只是写货物邪教代码,并不明白他们在做什么。

+0

谢谢,我会更新它为Epsilon使用更合适的值 – Dmihawk

2

比较使用的Epsilon 2和价值的平等当然是更正确的,但在大多数情况下,它是矫枉过正,很容易被错误编码为您的实例证明。

两个双打的区别就决不会小于小量不为零,你指示。所以为了有效(例如,做一些比简单的平等测试更有意义的事情),差异必须是< = Epsilon。

if (!(Math.Abs(_myProperty - value) <= double.Epsilon)) 

这允许两个值中的1位摆动。我认为你会消耗更多的CPU周期而不是保存它们。当然,对于接受用户输入这个测试是完全矫枉过正的。

我过去所做的是确定自己的Epsilon有现实世界的意义。例如,如果我正在监控实时温度测量,则我不感兴趣的变化小于1E-6摄氏度,因此我会将Epsilon定义为此。

相关问题