2017-02-22 184 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定義爲此。

相關問題