值類型的相等比較

5.3.2  值類型的相等比較

在進行值類型的相等比較時,採用與引用類型相同的規則:ReferenceEquals()用於比較引用,Equals()用於比較值,比較運算符可以看作是一箇中間項。但最大的區別是值類型需要裝箱,才能把它們轉換爲引用,才能對它們執行方法。另外,Microsoft已經在System.ValueType類中重載了實例方法Equals(),以便對值類型進行合適的相等測試。如果調用sA.Equals(sB),其中sA和sB是某個結構的實例,則根據sA和sB是否在其所有的字段中包含相同的值,而返回true或false。另一方面,在默認情況下,不能對自己的結構重載==運算符。在表達式中使用(sA==sB)會導致一個編譯錯誤,除非在代碼中爲結構提供了==的重載版本。

另外,ReferenceEquals()在應用於值類型時,總是返回false,因爲爲了調用這個方法,值類型需要裝箱到對象中。即使使用下面的代碼:

bool b = ReferenceEquals(v, v);          //v is a variable of some value type

也會返回false,因爲在轉換每個參數時,v都會被單獨裝箱,這意味着會得到不同的引用。調用ReferenceEquals()來比較值類型實際上沒有什麼意義。

儘管System.ValueType提供的Equals()默認重載肯定足以應付絕大多數自定義的結構,但仍可以爲自己的結構重寫它,以提高性能。另外,如果值類型包含作爲字段的引用類型,就需要重寫Equals(),以便爲這些字段提供合適的語義,因爲Equals()的默認重寫版本僅比較它們的地址。


發佈了17 篇原創文章 · 獲贊 2 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章