Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

В качестве расширения Отличный ответ Стефана - другое исключение - если операнды включают 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;
}

Из MSDN:

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

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

Например, со строками;Java == сравнивает ссылки на строковые объекты...(если вы используете примитивные типы, == в 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, если только оператор == не был перегружен.Не переопределено, как говорили другие, вы не можете переопределять операторы в С#, потому что они не виртуальные.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top