静态方法Object.Equals(Object, Object)支持引用类型的引用相等性和值类型的按位相等性,其中具有逐位相等性的比较对象具有相同的二进制表示,而比较的值相等对象具有相同的值,即使它们具有不同的二进制表示.
例如,由于i1和b1不同类型,它们没有相同的二进制表示,因此Object.Equals(Object, Object)返回false:
int i1 = 100;
byte b1 = 100;
Console.WriteLine(Object.Equals(i1, b1));//false
Run Code Online (Sandbox Code Playgroud)
Object.Equals(Object, Object)也应该在比较时返回false d1并且d2(因为两个变量具有相同值的不同二进制表示),但它返回true,这表明它使用值相等来比较它们:
decimal d1 = 1.10M;
decimal d2 = 1.100M;
Console.WriteLine(Object.Equals(d1, d2)); //true
Run Code Online (Sandbox Code Playgroud)
不应该Object.Equals(Object, Object)进行比较时,返回False d1和d2?
来自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)));
}
Run Code Online (Sandbox Code Playgroud)
我们来看看这些条款:
(objA == objB):这是对象相等运算符,它检查这两个对象是否引用同一对象.这个条款对我们来说是错误的.
(objA != null) && (objB != null):这适用于我们的情况.
objA.Equals(objB):这是真的(它委托给Decimal.Equals(Object))
我们已经完成了运算符true的RHS ||,因此整个语句的计算结果为true.
来自 MSDN:
http://msdn.microsoft.com/en-us/library/w4hkze5k.aspx
请注意,派生类型可能会重写 Equals 方法以实现值相等。值相等是指比较的对象具有相同的值但不同的二进制表示形式。
Decimal 肯定有一个 Equals 覆盖,如元数据中所示。
| 归档时间: |
|
| 查看次数: |
980 次 |
| 最近记录: |