2011-04-18 24 views
2

1)爲什麼IEqualityComparer<T>引入的原因:當時的IEqualityComparer <T>介紹有以下原因?

一),以便根據需要

b,我們將能夠在許多不同的方式爲相等比較(特定類型)的對象),並通過具有標準接口來實現自定義的相等比較,那麼第三方類將接受這個接口作爲參數的機會更大,並且允許我們通過實現對象的等式比較行爲注入這些類。012)不應該在類型上實現IEqualityComparer<T>T,我們試圖比較平等,但相反,我們應該在輔助類(es)上實現它?

謝謝

+0

如果您有兩個問題,請提出兩個問題,而不是兩個問題。 – Joey 2011-04-18 18:36:42

+0

已注意。將確保下一篇文章不包括多個(無關)的問題 – flockofcode 2011-04-18 19:02:27

回答

2

我懷疑,在這裏任何人都可以與任何權威原因的接口引入(我的猜測回答 - 而這一切都is--將支持泛型集合類型,如Dictionary<TKey, TValue>HashSet<T>)之一,但其purpose是明確的:

定義方法以支持對象平等的比較。

如果結合這與事實,你可以有多種類型實現了這個接口(見StringComparer),那麼答案質疑一個

這樣做的原因有三個方面:

  1. 運營商(在此情況下,==)不是多態的;如果類型upcasted到比特定類型的比較邏輯被定義其中較高的水平,那麼你最終執行基準比較,而不是使用==操作者中的邏輯。
  2. Equals()至少需要一個有效的參考,並且可以提供取決於它是否被稱爲第一或第二值不同的邏輯(一個可以被多個派生並覆蓋其他的邏輯)。
  3. 最後也是最重要的是,由該類型提供的比較邏輯可能不是用戶所追求的。例如,使用==Equals進行比較時,字符串(在C#中)區分大小寫。這意味着任何容器(如Dictionary<string, T>HashSet<string>)都將區分大小寫。允許用戶提供實現IEqualityComparer<string>的另一種類型意味着用戶可以使用他們喜歡的任何邏輯來確定一個字符串是否等於另一個字符串,包括忽略大小寫。

至於問題b,可能是,但我也不會感到驚訝,如果這是不高的優先名單上。

對於你最終的問題,我會說這通常是真的。儘管沒有什麼可以阻止你這樣做,但認爲T類型會提供自定義比較邏輯與T上提供的自定義比較邏輯不同,因爲它被引用爲IEqualiltyComparer<T>,這是令人困惑的。

+0

謝謝大家的幫助 – flockofcode 2011-04-18 19:03:41

1

有時候還有一類,在這種情況下,它應該實現IEquatable<T>,不IEqualityComparer<T>一個自然相等比較。在其他時候,有比較平等對象的多種可能的方式 - 是很有意義實現IEqualityComparer<T>然後。它允許哈希表(和集合等)以靈活的方式工作。

2
  1. 同意a和b

  2. 「不應該」 始終是一個規範性的問題,很少一個很好的指標。你做什麼都行,不會陷入困境。 (語用程序員)。您可以實現該接口有狀態,無狀態的,並且在任何哪種方式這一事實,使得它可以實現對所有類型,包括值類型,枚舉,密封型,甚至抽象類型(二選一)comparers;它在本質上是一個策略模式