[英]I thought Object.Equals(Object, Object) support bitwise equality and not value equality
靜態方法Object.Equals(Object, Object)
支持引用類型的引用相等,以及值類型的按位相等,其中,按位相等,比較的對象具有相同的二進制表示,而比較的值相等對象具有相同的值,即使他們有不同的二進制表示。
例如,由於i1
和b1
屬於不同類型,因此它們沒有相同的二進制表示,因此Object.Equals(Object, Object)
返回false
:
int i1 = 100;
byte b1 = 100;
Console.WriteLine(Object.Equals(i1, b1));//false
在比較d1
和d2
時Object.Equals(Object, Object)
也應返回false(因為兩個變量具有相同值的不同二進制表示),但它返回true
,這表明它使用值相等性來比較它們:
decimal d1 = 1.10M;
decimal d2 = 1.100M;
Console.WriteLine(Object.Equals(d1, d2)); //true
在比較d1
和d2
時Object.Equals(Object, Object)
不應該返回False嗎?
來自http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx :
例如,考慮兩個表示數字1.10和1.1000的Decimal對象。 Decimal對象沒有按位相等,因為它們具有不同的二進制表示以說明不同數量的尾隨零。
感謝名單
Decimal是值類型,Equals方法實際上使用Reflection比較其所有字段。 有關更多詳細信息,請參閱MSDN:
最后,MSDN的范圍不完整。 這里是:
例如,考慮兩個表示數字1.10和1.1000的Decimal對象。 Decimal對象沒有按位相等,因為它們具有不同的二進制表示以說明不同數量的尾隨零。 但是,對象具有值相等性,因為對於比較目的,數字1.10和1.1000被認為是相等的,因為尾隨零是無關緊要的。
Object.Equals應該實現值(非按位)相等。
在Decimal情況下,兩個對象的類型相同且值相等,因此結果為true。
在int,byte的情況下,對象的類型不同,因此結果為false。
您可以使用像reflector這樣的工具查看Object.Equals(Object,Object)的來源。
這是Object.Equals(Object,Object)的源代碼:
public static bool Equals(object objA, object objB)
{
return ((objA == objB) || (((objA != null) && (objB != null)) && objA.Equals(objB)));
}
我們來看看這些條款:
(objA == objB)
:這是對象相等運算符,它檢查這兩個對象是否引用同一個對象。 這個條款對我們來說是錯誤的。
(objA != null) && (objB != null)
:這適用於我們的情況。
objA.Equals(objB)
:這是真的(它委托給Decimal.Equals(Object))
我們在||
的RHS上都是true
運算符,因此整個語句的計算結果為true。
來自MSDN:
http://msdn.microsoft.com/en-us/library/w4hkze5k.aspx
請注意,派生類型可能會覆蓋Equals方法以實現值相等。 值相等意味着比較的對象具有相同的值但具有不同的二進制表示。
Decimal肯定有一個Equals覆蓋,可以在元數據中看到。
Object.Equals(Object objA, Object objB)
首先進行快速引用檢查( objA == objB
)。 如果失敗,它會嘗試調用Decimal重寫的虛擬Object.Equals(Object obj)
以提供值相等。
沒有辦法,按位相等沒有意義,它永遠不會正確。 無論以哪種按位格式存儲,我們都不在乎我們關心實際的商業價值。
出於商業或科學目的,1.10和1.100是相同的。 按位比較意味着詞法比較,這是錯誤的。 “1.10”與“1.100”不同,因為它們表示不正確的詞匯序列。
如果要比較實際位,則應使用BitConverter.GetBytes,它將為您提供實際的位序列。
Array.Compare(
BitConverter.GetBytes((decimal)1.10),
BitConverter.GetBytes((decimal)1.100))
我不知道是否有一個Array.Compare方法,但你可以創建一個,希望你明白這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.