[英]Converting Object.GetHashCode() to Guid
我需要為應用程序啟動和關閉時管理狀態的對象分配一個guid看起來我可以使用字典將查找值存儲在字典中
dictionary<int,Guid>.Add(instance.GetHashCode(), myGUID());
這里有什么潛在的問題需要注意嗎?
這不需要在執行運行之間持續存在,只需要像這樣的guid
在應用程序終止之前,gethashcode()和查找guid以更新()或插入()到持久性引擎USING GUID
唯一的假設是gethashcode()在進程運行時保持一致
在相同的對象類型(從窗口派生)上調用gethashcode()
List<WeakReference>
希望上面說清楚。
所以現在的問題是 - 為什么不只是存儲HashCode(僅用戶控件)而不是WeakReference
並在通過列表迭代時消除空引用的測試
更新3 - 謝謝所有,最后將使用弱引用
您似乎假設哈希碼是唯一的。 散列碼不起作用。 有關更多詳細信息,請參閱Eric Lippert 關於GetHashCode指南和規則的博客文章,但基本上您應該只為保持良好行為的類型做出假設 - 即如果兩個對象具有不同的哈希碼,則它們肯定是不相等的。 如果它們具有相同的哈希碼,則它們可能相等,但可能不相同。
編輯:如上所述,您也不應該在執行運行之間保留哈希碼。 面對重啟,無法保證他們會保持穩定。 目前還不是很清楚你正在做什么,但這聽起來不是一個好主意。
編輯:好的,你現在已經注意到它不會持久,所以這是一個好的開始 - 但你仍然沒有處理哈希碼沖突的可能性。 你為什么要調用GetHashCode()
? 為什么不添加對字典的引用?
使用GetHashCode來平衡哈希表 。 這就是它的用途。 不要將它用於其他非設計用途的目的; 那很危險
快速簡便的修復似乎是
var dict = new Dictionary<InstanceType, Guid>();
dict.Add(instance, myGUID());
當然,如果還沒有正確實現InstanceType.Equals。 (或實現IEQuatable<InstanceType>
)
我能想到的可能問題:
注 - Jon更優雅地說( 見上文 )
由於這是針對WPF控件的,為什么不將Guid添加為依賴項預測呢? 您似乎已經在迭代用戶控件,以獲取其哈希碼,因此這可能是一個更簡單的方法。
如果你想捕獲一個控件被刪除以及它有哪個Guid,那么訂閱關閉/刪除事件的一些管理器對象只是存儲Guid和其他一些細節將是一個好主意。 然后,如果需要,您還可以更輕松地捕獲更多詳細信息以進行分析。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.