2013-04-23 50 views
14
Object t = 4; 
Object s = 4; 

if (t == s) {  // false 
} 

List<Object> q = new List<object>() { t }; 
Boolean found = q.Contains(s);   // found = true! 

在上面的代码中,我并不感到惊讶,t == s返回false;它将对两个对象的引用进行比较,并且引用不相同。为什么Contains比对象比==更不同?

但我很惊讶Contains正在回归真实;显然这不仅仅是比较对象引用..它就像比较4和4的取消装箱值。但是它是如何知道如何以及为什么知道将对象拆箱来比较它们呢?我试图在这里了解更大的pricniple。

+0

我相信'=='默认为'对象'在内存中的引用比较,并且因为它们是两个不同的对象;他们在记忆中有两个不同的地方。因此他们不是'=='。 – 2013-04-23 18:13:30

回答

5

按照Contains文档:

确定序列是否包含通过使用 默认的相等比较指定的元素。

2

Contains使用Equals方法而不是==运算符。

+3

其实它可能使用'EqualityComparer .Default.Equals'。 – DeCaf 2013-04-23 18:14:05

+0

我得到一个虚拟的Equals方法(“默认比较器”)被调用来做比较..但我想象的方法在我的情况下被调用必须是Object.Equals,因为我正在做的类型Contains在对象上。如果是这样的话,那么Object.Equals如何知道如何解开内容并将它们作为整数进行比较? – 2013-04-23 18:26:32

+0

@DeCaf EqualityComparer .Default'使用引擎盖下的Object.Equals。 – MarcinJuraszek 2013-04-23 18:30:24

-1

Contains使用object.Equals(object),这对于int s被实施以便4.equals(4)为真。 ==与对象在每一方只使用参考比较。

同样注意:object.Equals(t, s) == true,因为this method使用实例的Equals方法,如果引用相等失败。

7

Contains,内部正在使用实例object.Equals方法来比较元素。它不使用==运算符。

Equals方法是虚拟的,而== operator是静态的。这意味着==运算符将根据编译时间类型变量(而不是运行时变量保存的对象)确定运行哪个代码。另一方面,虚拟方法不是静态绑定的。它根据值的变量的运行时间类型确定运行哪个过载Equals

0

==使用变量的类型来确定要比较的等式。

对于object/object它会做参考相等。

Contains将使用Equals方法,该方法是虚拟的,并且可能被重载以进行值比较。在这种情况下,int就是这样写的。

+0

'=='使用**变量**和**的类型而不是**对象的类型来确定要调用的方法。 – Servy 2013-04-23 18:15:21

相关问题