此属性设置器中的条件是否有效?
我正在重构我们的一些项目,以便与我们的客户之一重新使用,我希望能够理智地检查重写其中一个属性设置者的决定。此属性设置器中的条件是否有效?
我已经看到了这在执行我们的代码库几次,但因为它是由一个开发谁不再在这里工作,我不能问他这件事。
它去如下:
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#的一些小的细微差别我还没有介绍吗?
赔率是他们意思是要做的就是使用double.Epsilon
以外的一些Epsilon值。如你所指出的,double.Epsilon
在于double
可以表示最小的值,并且没有两个不同双打可以比double.Epsilon
更接近,并且作为结果,其代码是功能上等同于只是检查如果该差值等于零,这在功能上是完全相同,只是做两个双打定期平等检查。
逻辑背后的一般理念是让数字相互“足够接近”以便被认为是相等的,其中“足够接近”是一个基于数字的有效数字的值处理。他们打算使用SomeBusinessObject.Epsilon
来代表你正在使用的值的精确度,或者他们只是写货物*代码,并不明白他们在做什么。
比较使用的Epsilon 2和价值的平等当然是更正确的,但在大多数情况下,它是矫枉过正,很容易被错误编码为您的实例证明。
两个双打的区别就决不会小于小量不为零,你指示。所以为了有效(例如,做一些比简单的平等测试更有意义的事情),差异必须是< = Epsilon。
if (!(Math.Abs(_myProperty - value) <= double.Epsilon))
这允许两个值中的1位摆动。我认为你会消耗更多的CPU周期而不是保存它们。当然,对于接受用户输入这个测试是完全矫枉过正的。
我过去所做的是确定自己的Epsilon有现实世界的意义。例如,如果我正在监控实时温度测量,则我不感兴趣的变化小于1E-6摄氏度,因此我会将Epsilon定义为此。
谢谢,我会更新它为Epsilon使用更合适的值 – Dmihawk