![](/img/trans.png)
[英]What is the proper way to set a dictionary value which is a reference type to null?
[英]What must be done to use the value of a reference type as a dictionary key?
假設我有一個T
類,我想用它作為Dictionary<T,U>
集合中的一個鍵。
我必須在T
實現什么才能使這些鍵基於T
而不是T
引用的值?
我希望它只是GetHashCode()
。
您必須實現GetHashCode()和Equals()。
Dictionary是一個Hashtable,所以你可能想讀這個: Equals / GetHashCode的陷阱 - 哈希表是如何工作的?
如果你沒有在字典構造函數中傳遞任何IEqualityComparer<T>
,它將使用由MSDN定義的EqualityComparer<T>.Default
:
Default屬性檢查類型T是否實現System.IEquatable(Of T)接口,如果是,則返回使用該實現的EqualityComparer(Of T)。 否則,它返回一個EqualityComparer(Of T),它使用由T提供的Object.Equals和Object.GetHashCode的覆蓋。
因此實現IEquatable<T>
將是我的選擇(如果你實現它,無論如何IEquatable<T>
意義覆蓋Equals
和GetHashCode
)。
要么實現Equals
和GetHashCode
要么創建一個適當的IEqualityComparer<T>
,它具有正確的映射相等匹配形式。
我更喜歡IEqualityComparer<T>
路由:在很多情況下,沒有一種明顯正確的相等形式 - 你希望根據情況以不同的方式對待對象。 在這種情況下,自定義相等比較器正是您所需要的。 當然,如果有一個自然的平等操作,是有意義的實現IEquatable<T>
的類型本身......如果你能。 ( IEqualityComparer<T>
另一個好處是你可以為你無法控制的類型實現它。)
您需要覆蓋Equals(object obj)
。 在修改Equals
時,始終需要實現GetHashCode
。 在MSDN上閱讀這篇文章 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.