В Java существуют операторы "==" и "equals" для ссылочных типов и "==" для типов значений. для ссылочного типа "==" означает, что оба объекта указывают на одно и то же место, а "равно" означает, что их значения одинаковы. У С# есть похожие операторы для типов значений и ссылочных типов?
С# == отличается в типах значений и ссылочных типах?
Ответ 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
Ответ 4
Когда я должен использовать == и когда следует использовать Equals?
http://blogs.msdn.com/csharpfaq/archive/2004/03/29/102224.aspx
Ответ 5
Именно так оно и работает с .NET. С# часто задает вопрос в блоге:
Метод Equals - это просто виртуальный один, определенный в System.Object, и переопределяется тем, какие классы выбирают для этого. Оператор == является оператора, который может быть перегружен классов, но обычно идентичность.
Для ссылочных типов, где == не был перегружен, он сравнивает, две ссылки относятся к тому же объект - это именно то, что реализация Equals в System.Object.