2012-06-02 14 views
4

Можно создать дубликат:
== or .Equals()Разница между .equals (N) и == N

У меня есть массив строк и просто хотите подсчитать количество расщепленных строк элементов в массиве ,

Но я не могу решить, какой вариант я хочу/необходимость/следует использовать:

if(myStringArray.Count.Equals(47)) 
{ 
    // Do something. 
} 

или

if(myStringArray.Count == 47) 
{ 
    // Do something. 
} 

Может кто-то пожалуйста, помогите мне понять разницу между этими двумя подходами и почему оба существуют?

Я пробовал оба, и оба дают одинаковый результат.

+3

Мне не нравится принятый ответ в том, что дублировать ...он пропускает важные отличия, такие как неполиморфный характер операторов, в том числе '==', и что 'Equals' является частью контракта' object' ... –

+1

(FWIW, I * always * - как и я не могу думать счетчика в данный момент - используйте '==' over * типы, для которых он [хорошо] определен *: это включает в себя все стандартные типы структуры, такие как 'int' и' Guid'. То есть, type не используется в полиморфном режиме и определяет '=='.) –

ответ

6

Метод Equals обеспечивает средство для типа объекта для определения «равенства» между двумя экземплярами. С номерами, Equals и == одно и то же, но когда вы используете типы объектов, они разные: Equals сравнивает равенство (являются два объекта эквивалентны друг другу), и == сравнивает идентичность (являются два ссылки на тот же объект). Автору класса будет переопределять Equals и (как правило) сравнить либо все поля объекта с полями другого объекта, либо сравнить поля , в зависимости от класса.

+0

Я не уверен в этом бокс-бит ... не структурируйте типы «расширяйте» объект? Например. они должны иметь Equals, GetHashCode и т. д., * без * бокса? –

+1

@pst Все имеет 'Equals' (и 3 других), потому что все это' object', а 'object' определяет эти методы. Могу ли я добавить к ответу, что оператор '==' может быть перегружен, а также 'Equals' может быть переопределен. – SimpleVar

+0

@YoryeNathan Я просто не понимаю, где здесь происходит бокс ... 'object boxed = 1' - это то, что я могу понять, потому что' Object.ReferenceEquals ((object) 1, (object) 1) 'is false. –

0

Может кто-то пожалуйста, помогите мне понять разницу между этими двумя подходами

Там нет никакой разницы в функциональности, но второй один легче читать и понимать, так что это является предпочтительным.

и почему оба существуют?

В C#, System.Int32 представляет собой структуру, поэтому она имеет Equals(Object) метод, унаследованный от System.Object. Разработчики .NET также добавили метод Equals(Int32), который предоставляет альтернативу с тем же синтаксисом. Я никогда не видел Equals(Int32), который используется в производственном коде, просто потому, что читать можно ==.

1

В случае структуры, как и целое число, используемое здесь, разницы не будет. Для классов может быть.

Для структур, таких как int, bool, datetime и т. Д., Внутреннее значение сравнивается с ==, а не ссылкой. для классов == сравнивает ссылку, но equals можно переопределить, чтобы применить пользовательский сопоставление. , например, если класс Foo это класс, который содержит первичный ключ, и переопределить это база равна реализации сравнить ключи:

var foo1 = new Foo{PrimaryKey = 5}; 
var foo2 = new Foo{PrimaryKey = 5}; 
foo1 == foo2 //false 
foo1.Equals(foo2) //true 
Смежные вопросы