2014-03-06 81 views
3

我環顧四周,但似乎沒有人問過這個問題,所以在這裏。Int32.Equals vs'=='運營商

我正在做一個自定義類,它將具有IEquatable接口,因此我正在製作自己的Equals方法。下面是它的樣子:

public bool Equals(QueryFilter qfilter) 
    { 
     if (qfilter == null) 
     { 
      return false; 
     } 
     return ((this.Value.Equals(qfilter.Value)) && 
      (this.Name.Equals(qfilter.Name)) && 
      (this.Order == qfilter.Order)); 
    } 

其中值,名稱和順序是QueryFilter類的字段。價值和名稱是strings,但訂單是int,我想知道是否使用==運營商是好的,或者如果我應該去Int32.Equals方法,以「匹配」其他字段如何進行比較?我查了MSDN,但沒有詳細說明,只是說它已經超載了,但我不確定在這種情況下是什麼意思。 ==將永遠在工作中嗎?

那麼總之,哪一個更好? Int32.Equals==?我應該什麼時候使用每一個?

+1

你可能想看到這個問題:http://stackoverflow.com/questions/7345970/c-default-implementation-for-and-operators-for-objects –

回答

16

是,使用==運營商絕對是很好,所以只要編譯時Orderint

如果編譯時類型是object例如,那麼你會處理盒裝int值和參考平等,這是不是你追求的比較那些箱子。但只要編譯器知道它們是int值,就沒關係。

請注意,這是罰款爲NameValue做到這一點 - 再次,假設編譯時類型的屬性是string(因爲編譯器將使用由string提供過載然後就可以了。用事實&&是短路,擺脫不必要的括號,並留下與獲得。

public bool Equals(QueryFilter other) 
{ 
    return other != null && 
      this.Value == other.Value && 
      this.Name == other.Name && 
      this.Order == other.Order; 
} 

...我肯定會更願意看到

這也處理ValueNamenull的情況,以一種明顯的方式(空引用彼此相等並且不等於任何非空引用)。如果您的現有代碼的空屬性值達到this.Value.Equalsthis.Name.Equals,則會拋出NullReferenceException。 (很可能你確保這種情況永遠不會發生,但值得注意。)

你還應該確保你的哈希碼與等號一致,並且也覆蓋Equals(object)

+0

我沒有考慮使用運算符進行字符串比較!就像你說的,我確信名稱和價值永遠不會是空的,但也很好地瞭解這一點。所以謝謝你的答案! –