静态方法Object.Equals(Object, Object)
支持引用类型的引用相等,以及值类型的按位相等,其中具有逐位相等性的比较对象具有相同的二进制表示,而比较的值相等对象具有相同的值,即使他们有不同的二进制表示。
例如,由于i1
和b1
属于不同类型,因此它们没有相同的二进制表示形式,因此Object.Equals(Object, Object)
会返回false
:
int i1 = 100;
byte b1 = 100;
Console.WriteLine(Object.Equals(i1, b1));//false
在比较Object.Equals(Object, Object)
和d1
时, d2
也应该返回false(因为这两个变量具有相同值的不同二进制表示),而是返回true
,这表明它使用价值平等来比较它们:
decimal d1 = 1.10M;
decimal d2 = 1.100M;
Console.WriteLine(Object.Equals(d1, d2)); //true
在比较Object.Equals(Object, Object)
和d1
时,d2
不应该返回False吗?
来自http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx:
例如,考虑两个Decimal 表示数字的对象 1.10和1.1000。 Decimal对象没有按位相等,因为 他们有不同的二进制 代表说明 不同数量的尾随零。
感谢名单
答案 0 :(得分:9)
Decimal是一种值类型,Equals方法实际上使用Reflection比较其所有字段。有关更多详细信息,请参阅MSDN:
最后,MSDN的范围不完整。这是:
例如,考虑两个Decimal 表示数字的对象 1.10和1.1000。 Decimal对象没有按位相等,因为 他们有不同的二进制 代表说明 不同数量的尾随零。 但是,对象具有价值 平等因为数字1.10和 自结尾以来,1.1000被认为是相同的比较目的 零是微不足道的。
答案 1 :(得分:7)
Object.Equals应该实现值(非按位)相等。
在Decimal情况下,两个对象的类型相同且值相等,因此结果为true。
在int,byte的情况下,对象的类型不同,因此结果为false。
答案 2 :(得分:5)
您可以使用像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))
我们在true
运算符的RHS上得到了所有||
,因此整个语句的计算结果为true。
答案 3 :(得分:1)
来自MSDN:
http://msdn.microsoft.com/en-us/library/w4hkze5k.aspx
请注意,派生类型可能会覆盖Equals方法以实现值相等。值相等意味着比较对象具有相同的值但具有不同的二进制表示。
Decimal肯定有一个Equals覆盖,可以在元数据中看到。
答案 4 :(得分:1)
Object.Equals(Object objA, Object objB)
首先进行快速参考检查(objA == objB
)。如果失败,它会尝试调用Decimal覆盖的虚拟Object.Equals(Object obj)
以提供值相等。
答案 5 :(得分:1)
没有办法,按位相等没有意义,它永远不会正确。无论以任何按位格式存储的是什么,我们都不在乎我们关心实际的商业价值。
出于商业或科学目的,1.10和1.100是相同的。按位比较意味着词法比较,这是错误的。 “1.10”与“1.100”不同,因为它们表示不正确的词汇序列。
如果要比较实际位,则应使用BitConverter.GetBytes,它将为您提供实际的位序列。
Array.Compare(
BitConverter.GetBytes((decimal)1.10),
BitConverter.GetBytes((decimal)1.100))
我不知道是否有一个Array.Compare方法,但你可以创建一个,希望你明白这一点。