簡體   English   中英

沒有字段的對象:如何實現GetHashCode?

[英]Object with no fields: how to implement GetHashCode?

我的復雜結構中的Dictionary<Object, Object> Annotations具有一個Dictionary<Object, Object> Annotations屬性,可以在其中存儲在某些處理階段使用的元數據和自定義數據。 現在,我可以創建一個static readonly object UniqueName = new object()並將其用作字典中的鍵。 我使用static readonly object因為我確定它是唯一的。 沒有其他人可以創建完全相同的對象實例。 相反,如果我使用字符串作為鍵,那么其他人可能會意外地使用與該鍵相同的字符串,這可能會引起問題。

但是,我從多個來源(包括here )了解到,默認的GetHashCode實現是基於對象在內存中的位置。 當對象由垃圾回收器移動時,這可能會更改,這將導致它返回的哈希值發生更改。 發生這種情況時,詞典將無法找到與鍵對象關聯的值。

如何確保沒有字段的對象在其生存期內從不更改其哈希碼?

天真的解決方案是創建一個Key對象,該對象的GetHashCode始終返回42 但是,這將嚴重影響字典的性能,因此不是解決方案。

實現可能會更改它返回的哈希

默認的哈希碼實現將永遠不會更改單個對象的值。 它在該對象的生存期內永遠不會改變,因此可以安全地使用。 我(快速地)閱讀了您所指向的答案,但是他們沒有談論在單個對象的生存期內更改的哈希碼。

GetHashCode的默認實現返回一個索引,而不是一個內存地址。 該索引在對象的生命周期中是唯一的,因此即使您的對象在內存中四處移動,當您調用GetHashCode時,它將始終返回相同的值。

但是,一旦對象被垃圾回收,它對您之后創建的新對象有效,以返回與垃圾回收之前的先前對象相同的值。

在您的示例中,當您調用GetHashCodeUniqueName變量將始終返回相同的值,並且您創建的Object實例將永遠不會在程序的生命周期內返回相同的哈希碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM