2013-04-23 2 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; он сравнивает ссылки на два объекта, а ссылки не совпадают.Почему Содержит объекты сравнения иначе, чем ==?

Но я удивлен тем, что Содержит возвращает истину; очевидно, это не просто сравнение ссылок на объекты .. это похоже на сравнение необоснованных значений 4 и 4 .. но как и почему он знает, чтобы удалить объекты для сравнения? Я пытаюсь понять, чем больше приключений здесь играет.

+0

Я полагаю, что '==' по умолчанию ссылается на сравнительное сравнение того, где «Объекты» находятся в памяти, и поскольку они представляют собой два разных объекта; у них есть два разных места в памяти. Поэтому они не '=='. –

ответ

5

Согласно документации Contains:

Определяет, содержит ли последовательность заданный элемент, используя компаратор равенство по умолчанию.

2

Contains использует Equals методы вместо == оператора.

+3

На самом деле он, вероятно, использует 'EqualityComparer .Default.Equals'. – DeCaf

+0

Я получаю, что виртуальный метод Equals («сопоставление по умолчанию») вызывает вызов для сравнения. Но я предполагаю, что метод, вызываемый в моем случае, должен быть Object.Equals, поскольку типы, которые я делаю, содержат on - Объекты. И если это так, как бы Object.Equals знал, что нужно удалить содержимое и сравнить их как ints? –

+0

@DeCaf 'EqualityComparer .Default' использует' Object.Equals' под капотом. – MarcinJuraszek

-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

12

Выражение

q.Contains(s) 

ищет элемент q, для которого EqualityComparer<object>.Default.Equals(element, s) верно. Для примитивов в штучной упаковке это сравнивает значения.