簡體   English   中英

我認為Object.Equals(Object,Object)支持按位相等而不是值相等

[英]I thought Object.Equals(Object, Object) support bitwise equality and not value equality

靜態方法Object.Equals(Object, Object)支持引用類型的引用相等,以及值類型的按位相等,其中,按位相等,比較的對象具有相同的二進制表示,而比較的值相等對象具有相同的值,即使他們有不同的二進制表示。

例如,由於i1b1屬於不同類型,因此它們沒有相同的二進制表示,因此Object.Equals(Object, Object)返回false

        int  i1 = 100;
        byte b1 = 100;
        Console.WriteLine(Object.Equals(i1, b1));//false

在比較d1d2Object.Equals(Object, Object)也應返回false(因為兩個變量具有相同值的不同二進制表示),但它返回true ,這表明它使用值相等性來比較它們:

        decimal d1 = 1.10M;
        decimal d2 = 1.100M;
        Console.WriteLine(Object.Equals(d1, d2)); //true

在比較d1d2Object.Equals(Object, Object)不應該返回False嗎?

來自http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx

例如,考慮兩個表示數字1.10和1.1000的Decimal對象。 Decimal對象沒有按位相等,因為它們具有不同的二進制表示以說明不同數量的尾隨零。

感謝名單

Decimal是值類型,Equals方法實際上使用Reflection比較其所有字段。 有關更多詳細信息,請參閱MSDN:

ValueType.Equals方法

最后,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.

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