close
說明文件或一些文章都會有一些重要的說明
但沒辦法仔細地說明為什麼
所以我把我查到的東西整理一下
多少有一些概念

Structure是隱含繼承自ValueType
而ValueType則是繼承自Object
ValueType的概念是同樣value的物件應被視為等同
所以Equals應傳回true
GetHashCode也應為相同的HashCode

而ValueType本來即覆寫Object的Equals
不像Object比較物件的reference
ValueType會以reflection來比對物件中field的value
來判斷是否等同

因此才會有實作Equals來覆寫ValueType的Equals可以改進效能的說法
因為自己實作的Equals提供了用來比較value的方法
而不用ValueType麻煩的比較方法

在VB .NET在自己的方法多載是不用加Overloads但如果多載繼承的物件就需要加
所以覆寫Equals是需要加的
因為雖然ValueType沒有多載Equals
只有Equals(obj)
但ValueType所繼承的Object則有Equals的多載Equals(objA,objB)

GetHashCode的情況也差不多
ValueType也有一套麻煩的方法
所以以自己分別的方法來覆寫也是必要的
必須與Equals的邏輯一致
看樣子一般是以相關的field對其HashCode做XOR來產生新的HashCode

這裡有一個地方會影響Structure的設計
在相關的field如果是String的話
空值可能必須使用String.Empty而非Nothing
因為String.Empty才會有HashCode
arrow
arrow
    全站熱搜

    marksu22 發表在 痞客邦 留言(0) 人氣()