C# 我认为Object.Equals(Object,Object)支持位相等,而不是值相等

C# 我认为Object.Equals(Object,Object)支持位相等,而不是值相等,c#,C#,静态方法Object.Equals(Object,Object)支持引用类型的引用相等和值类型的按位相等,其中按位相等比较的对象具有相同的二进制表示形式,而值相等对象具有相同的值,即使它们具有不同的二进制表示形式 例如,由于i1和b1属于不同的类型,它们没有相同的二进制表示形式,因此Object.Equals(Object,Object)返回false: int i1 = 100; byte b1 = 100; Console.WriteLine

静态方法
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
当比较
d1
d2
时,不应该
Object.Equals(Object,Object)
返回False

发件人:

例如,考虑两个十进制数 表示数字的对象 1.10和1.1000。十进制对象没有按位相等,因为 它们有不同的二进制代码 就 不同数量的尾随零

来自MSDN的thanx:

请注意,派生类型可能会重写Equals方法以实现值相等。值相等意味着被比较对象具有相同的值,但具有不同的二进制表示形式


从元数据中可以看出,Decimal肯定有一个Equals覆盖。

Object.Equals(Object objA,Object objB)
首先进行快速引用检查(
objA==objB
)。如果失败,它将尝试调用虚拟的
Object.Equals(Object obj)
,该十进制覆盖提供值相等。

您可以使用类似reflector的工具查看Object.Equals(Object,Object)的源

以下是Object.Equals(Object,Object)的源代码:

让我们来看看这些条款:

(objA==objB)
:这是对象相等运算符,用于检查这两个对象是否引用同一个对象。这一条款对我们来说是错误的

(objA!=null)和&(objB!=null)
:这对于我们的情况是正确的

objA.Equals(objB)
:这是真的(它委托给Decimal.Equals(Object))


我们在
|
运算符的RHS上得到了所有的
true
,因此整个语句的计算结果都是true。

不可能,按位相等没有意义,也永远不正确。无论以哪种位格式存储,我们都不关心实际的业务价值

出于商业或科学目的,1.10和1.100是相同的。按位比较意味着词法比较,这是错误的。“1.10”和“1.100”是不同的,因为它们代表不正确的词汇顺序

Array.Compare( 
   BitConverter.GetBytes((decimal)1.10),
   BitConverter.GetBytes((decimal)1.100))
如果要比较实际位,则应使用BitConverter.GetBytes,它将提供实际位序列

Array.Compare( 
   BitConverter.GetBytes((decimal)1.10),
   BitConverter.GetBytes((decimal)1.100))

我不知道是否有数组。比较方法与否,但你可以创建一个数组,希望你能抓住要点

Object.Equals应该实现值(而不是位)相等

在十进制情况下,两个对象的类型相同,且值相等,因此结果为真


在int,byte的情况下,对象的类型不同,因此结果为false。

Decimal是一种值类型,Equals方法实际上使用反射比较其所有字段。有关更多详细信息,请参阅MSDN:

最后,MSDN中的范围不完整。这是:

例如,考虑两个十进制数 表示数字的对象 1.10和1.1000。十进制对象没有按位相等,因为 它们有不同的二进制代码 就 不同数量的尾随零。 但是,这些对象具有价值 因为数字1.10和 出于比较目的,1.1000被认为是相等的,因为 零是无关紧要的


这是一个奇怪的错误,你已经发现页面是静态等于方法的,静态等于方法调用另一个。(只要两个对象都存在且引用不相等)据我所知,Int32.Equals、Byte.Equals和Decimal.Equals(对象)不使用值相等?!您应该编写
1.10m
而不是强制转换。在许多情况下,
Equals(Object)
的类型行为与其他Equals重载或
=
的类型行为不匹配。我建议
Equals(Object)
应该代表比其他形式更严格的平等:应该是“应该
X
被认为可以替代
Y
”。我认为既然
1.0m
1.00m
表现不同,
1.0m.Equals((Object)1.00m)
应该是假的,即使
1.0m.Equals(1.00m)
是真的,就像
1.0m.Equals((Object)1)
是假的,但是
1.0m.Equals(Object)是真的。Int32.Equals(Object obj)如果obj是Int32的实例并等于此实例的值,则返回true。如果obj是byte类型,则返回False。这不意味着Int32.Equals(Object)使用逐位比较吗?否则,为什么仅仅因为obj的类型是byte而不是int就返回false呢?它可能会检查这些类型。如果obj不是Int32的实例,它将返回false。它会检查类型。这里是Int32.Equals(object Obj),反编译:
public override bool Equals(object Obj){if(!(Obj是int))返回false;否则返回this==(int)Obj;}
»在int,byte的情况下,对象的类型不同,因此结果是false。«Int32.Equals(object Obj)如果obj是Int32的实例并等于此实例的值,则返回true。如果obj的类型是byte,那么它返回False。这不是意味着Int32.Equals吗