C # что делает оператор == подробно? - PullRequest
15 голосов
/ 30 апреля 2009

в c # что именно происходит в фоновом режиме при сравнении с оператором "==" для двух объектов? это просто сравнить адреса? или это что-то вроде Equals () или CompareTo ()?

PS: как насчет оператора "==" в Java? ведет себя так же?

Ответы [ 6 ]

24 голосов
/ 30 апреля 2009

Насколько я знаю:

  • сравнивает типы значений по значению (равенству)
  • сравнивает ссылочные типы по ссылке (идентификатору)
  • за исключением случаев, когда оператор == перегружен, он вызывает его.

Equals реализован в объекте и также может быть переопределен. Реализация по умолчанию в Object выполняет сравнение ссылок для ссылочных типов. Поэтому по умолчанию Equals и == делают то же самое.

Я думаю, что в Java вы не можете перегрузить оператор ==. Но мои знания Java довольно устарели.

Edit: Обратите внимание, что оператор == является статическим методом. Он привязан во время компиляции, основывается на типах ваших переменных или полей. Equals - это виртуальный метод, который обнаруживается во время выполнения на основе фактических типов времени выполнения.

9 голосов
/ 30 апреля 2009

В качестве дополнения к Отличный ответ Стефана - другое исключение, если операнды включают Nullable<T> - в этом случае применяются "поднятые" операторы (14.2.7 в ECMA 334v4):

Для операторов равенства ==! =

существует поднятая форма оператора, если оба типа операнда ненулевые типы значений, и если тип результата - bool. Поднятая форма построен путем добавления одного? модификатор для каждого типа операнда. поднял оператор считает два нуля значения равны, а нулевое значение неравно к любому ненулевому значению. Если оба операнды ненулевые, поднятые Оператор разворачивает операнды и применяет базовый оператор к выдает результат bool.

Что это означает: потому что есть оператор равенства между (скажем):

int i = ..., j = ...;
bool eq = i == j;

Таким образом, существует неявный оператор вида (хотя и выполняется по-разному):

int? i = ..., j = ...;
bool eq;
if(i.HasValue) {
    if(j.HasValue) { // both have values; compare
       eq = i.GetValueOrDefault() == j.GetValueOrDefault();
    } else { // one null; always false
       eq = false;
    }
} else { // true if both null, else false
    eq = !j.HasValue;
}
4 голосов
/ 30 апреля 2009

От MSDN :

Для предопределенных типов значений Оператор равенства (==) возвращает true, если значения его операндов равны, ложь в противном случае. Для справочных типов кроме строки, == возвращает true, если два его операнда относятся к одному и тому же объект. Для типа строки == сравнивает значения строк.

3 голосов
/ 30 апреля 2009

Нет ... оператор == не всегда ведет себя одинаково в Java и в C #.

Например, со строками; Java == сравнивает ссылки на строковые объекты ... (если вы используете примитивные типы, == в java сравнивает значения). Вот почему

// returns FALSE in JAVA
(new String("test") == "test") 

не вернет истину в Java ...

В отличие от этого, в C # оператор == ведет себя по-разному в строках. Например, он вернет true в следующем случае:

// returns TRUE in C#
(new String("test".ToCharArray()) == "test") 
1 голос
/ 30 апреля 2009

Что это делает, зависит от контекста.

http://en.csharp -online.net / ECMA-334: _14.9_Relational_and_type-testing_operators

0 голосов
/ 17 августа 2009

Поведение оператора == зависит от того, как была объявлена ​​переменная, к которой вы его применяете (не от класса объекта, я добавлю пример).

Для типов значений он сравнивает их значения.

Для ссылочных типов a == b возвращает true, если a является тем же объектом, что и b, если только оператор == не был перегружен. Не переопределяя, как говорили другие, вы не можете переопределить операторы в C #, потому что они не являются виртуальными.

object obj_a, obj_b; string str_a, str_b;</p> <pre><code> str_a = "ABC"; str_b = new string("ABC".ToCharArray()); obj_a = str_a; obj_b = str_b; Console.WriteLine("str_a == str_b = {0}", str_a == str_b); // in string == operator is overloaded Console.WriteLine("str_a.Equals(str_b) = {0}", str_a.Equals(str_b)); // string overrides Object.Euqals Console.WriteLine("obj_a == obj_b = {0}", obj_a == obj_b); // in object == operator is not overloaded Console.WriteLine("obj_a.Equals(obj_b) = {0}", obj_a.Equals(obj_b)); // Object.Equesl is virtual and overridden method from string will be executed. Console.ReadKey();

Вывод этой программы

str_a == str_b = True
str_a.Equals(str_b) = True
obj_a == obj_b = False
obj_a.Equals(obj_b) = True

...