Jos*_*ose 14 c# equality equals
我有以下代码:
object val1 = 1;
object val2 = 1;
bool result1 = (val1 == val2);//Equals false
bool result2 = val1.Equals(val2); //Equals true
Run Code Online (Sandbox Code Playgroud)
那是怎么回事?修复此问题的唯一方法是使用.Equals()方法吗?
Mar*_*ers 33
运算符==是静态的,而不是虚拟的,因此行为由静态类型而不是运行时类型决定.引用类型的on对象的默认实现==是比较引用(例如,类型可以实现不同的行为string).您有两个不同的对象,它们没有相同的引用,因此==返回false.
正如您所指出的,解决方案是使用Equals.Equals是一种虚拟方法.由于value1具有运行时类型Int32,因此最终调用Int32.Equals.从.NET Reflector可以看到,其实现如下:
public override bool Equals(object obj)
{
return ((obj is int) && (this == ((int) obj)));
}
Run Code Online (Sandbox Code Playgroud)
换句话说,它检查参数是否是类型int,如果是,则转换它并使用==为其定义的参数int.这比较了整数的值.
修复此问题的唯一方法是使用.Equals()方法吗?
另一种方法是将对象转换为int然后使用==,就像执行Int32.Equalsdo一样.
And*_*rey 10
是.==检查参考相等性.使用Equals要比较的内容.
您可能想知道为什么对象如此.将整数(值类型)设置为对象变量时,会发生称为装箱的操作.此操作将值类型包装到对象中,并将其放在堆上并返回引用.这种情况发生两次,引用变得不同(尽管值相同).
| 归档时间: |
|
| 查看次数: |
8312 次 |
| 最近记录: |