簡體   English   中英

Inproc和Stateserver會話變量的GetHashCode的不同值

[英]Different values of GetHashCode for inproc and stateserver session variables

我最近繼承了一個非常大量使用會話的應用程序,包括在會話中存儲大量自定義數據對象。 我使用該應用程序的首要業務之一是至少將會話數據從InProc中移出,然后將其卸載到狀態服務器或SQL Server中。

在使所有適當的數據對象可序列化並將web.config更改為使用狀態服務后,一切似乎都可以正常工作。

但是,我發現此應用程序使用GetHashCode()進行了大量對象比較。 在會話為InProc時可以正常工作的方法不再起作用,因為HashCodes在應有的條件下不再匹配。 當您知道子對象的原始哈希碼時,嘗試從父對象中查找特定的子對象時,情況似乎就是這樣。

如果我只是簡單地將web.config更改回使用inproc,它將再次起作用。

任何人都從哪里開始有任何想法?


編輯:

qbeuek:感謝您的快速回復。 關於:

Object類中GetHashCode的默認實現基於內存或類似對象中的對象地址返回哈希值。 如果需要進行其他身份比較,則必須覆蓋Equals和GetHashCode。

我應該提供更多有關他們如何使用它的信息。 基本上,它們具有一個父數據對象,並且有多個子對象數組。 他們碰巧知道他們需要的特定對象的哈希碼,因此他們在子對象的特定數組中循環查找匹配的哈希碼。 找到匹配項后,他們便將該對象用於其他工作。

當你寫

使用GetHashCode()進行很多對象比較

我覺得這段代碼有些可怕的錯誤。 GetHashCode方法不能保證,給定兩個不同的對象,返回的哈希值無論如何都應該是唯一的。 就GetHashCode而言,它可以為所有對象返回0,仍然被認為是正確的。

當兩個對象相同時(Equals方法返回true),它們必須具有從GetHashCode返回的相同值。 當兩個對象具有相同的哈希值時,它們可以是相同的對象(Equals返回true),也可以是不同的對象(Equals返回false)。

GetHashCode的結果沒有其他保證。

Object類中GetHashCode的默認實現基於內存或類似對象中的對象地址返回哈希值。 如果需要其他一些身份比較,你必須覆蓋了equals和GetHashCode。

在稱為該方法的類中重寫GetHashCode方法,並根據唯一的對象屬性(例如ID或所有對象字段)計算哈希碼。

解決方案1:為所有子對象創建唯一的ID,並使用該ID代替哈希碼。

解決方案2:將if(a.GetHashCode()== b.GetHashCode())替換為if(a.Equals(b))。

暫無
暫無

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

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