Подтвердить что ты не робот

С# == отличается в типах значений и ссылочных типах?

В Java существуют операторы "==" и "equals" для ссылочных типов и "==" для типов значений. для ссылочного типа "==" означает, что оба объекта указывают на одно и то же место, а "равно" означает, что их значения одинаковы. У С# есть похожие операторы для типов значений и ссылочных типов?

4b9b3361

Ответ 1

Ну, == может быть перегружен для ссылочных типов. Например:

string a = new string('x', 10);
string b = new string('x', 10);
Console.WriteLine(a == b); // True
Console.WriteLine(Object.ReferenceEquals(b)); // False

Если он не перегружен, == означает "ссылочное равенство", например, "идентификатор объекта" для ссылочных типов. (Как говорит Марк, вы можете переопределить Equals без перегрузки ==.)

Для типов значений вам нужно перегрузить ==, иначе компилятор С# не позволит вам использовать его для сравнения. Сама .NET обеспечит реализацию Equals, которая обычно делает правильные вещи, но иногда медленно - в большинстве случаев, если вы пишете свой собственный тип значения, вы хотите реализовать IEquatable<T> и переопределить Equals, а также - и, возможно, перегружать различные операторы.

Ответ 2

С# позволяет перегрузить оператор == (и метод Equals, который нужно переопределить), хотя == и Equals не должны означать одно и то же).

Если вы хотите иметь в виду "один и тот же экземпляр", то лучший вариант - object.ReferenceEquals (для ссылочных типов). Типы значений по умолчанию для внутреннего равенства.

Ответ 3

Прямо из MSDN:

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

Джон Скит должен быть в состоянии дать вам прекрасный ответ: P

Ответ 5

Именно так оно и работает с .NET. С# часто задает вопрос в блоге:

Метод Equals - это просто виртуальный один, определенный в System.Object, и переопределяется тем, какие классы выбирают для этого. Оператор == является оператора, который может быть перегружен классов, но обычно идентичность.

Для ссылочных типов, где == не был перегружен, он сравнивает, две ссылки относятся к тому же объект - это именно то, что реализация Equals в System.Object.