C# что делает оператор == подробно?

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

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

6 ответов


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

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

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

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

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


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

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

поднятая форма оператора существует, если типы операндов являются обоими ненулевые типы значений и если тип результата-bool. Поднятая форма строится путем добавления одного ? модификатор для каждого типа операндов. Этот оператор lifted считает два null значения равны, а значение null неравно к любому ненулевому значению. Если оба операнды ненулевые, поднятые оператор разворачивает операнды и применяет базовый оператор к вырабатывают результат типа 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;
}

из MSDN:

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


нет ... оператор == не всегда ведет себя одинаково в java и в c#.

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

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

не вернет true в java...

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

// returns TRUE in C#
(new String("test".ToCharArray()) == "test") 

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

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


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

для типов значений, он будет сравнивать их значения.

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

object obj_a, obj_b; string str_a, str_b;

        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