С#, что делает оператор == в деталях?
в С# что происходит в фоновом режиме, когда вы выполняете сравнение с оператором "==" на двух объектах? он просто сравнивает адреса? или делает что-то вроде Equals() или CompareTo()?
PS: как насчет оператора "==" в java? он ведет себя одинаково?
Ответы
Ответ 1
Насколько я знаю:
- он сравнивает типы значений по значению (равенству)
- сравнивает ссылочные типы по ссылке (identity)
- за исключением случаев, когда оператор == перегружен, тогда он вызывает это.
Равные значения реализуются в объекте и могут быть также переопределены. Реализация по умолчанию в Object выполняет сравнение ссылок для ссылочных типов. Поэтому по умолчанию Equals и == делают то же самое.
Я думаю, что в java вы не можете перегрузить оператор ==. Но мои знания Java довольно устарели.
Edit:
Обратите внимание, что оператор ==
является статическим методом. Он привязан во время компиляции, основываясь на типах ваших переменных или полей. Equals
- это виртуальный метод, который находится во время выполнения на основе реальных типов времени выполнения.
Ответ 2
Как расширение отличный от Stefan - другое исключение - если операнды включают 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;
}
Ответ 3
Из MSDN:
Для предопределенных типов значений оператор равенства (==) возвращает true, если значения его операндов равны, false в противном случае. Для ссылочных типов кроме строки, == возвращает true, если его два операнда относятся к тому же объект. Для типа строки == сравнивает значения строк.
Ответ 4
Нет... оператор == не всегда ведет себя одинаково в java и С#.
Например, со строками; Java == сравнивает ссылки на строковые объекты... (если вы используете типы primitve, == в java сравнивает значения). Вот почему
// returns FALSE in JAVA
(new String("test") == "test")
не вернет true в java...
В отличие от С#, оператор == ведет себя по-разному в строках. Например, он вернет true в следующем случае:
// returns TRUE in C#
(new String("test".ToCharArray()) == "test")
Ответ 5
Что это делает, зависит от контекста.
http://en.csharp-online.net/ECMA-334:_14.9_Relational_and_type-testing_operators
Ответ 6
Поведение оператора == зависит от того, как была объявлена переменная, с которой вы ее применяете (не в классе объекта, я добавлю пример).
Для типов значений он будет сравнивать свои значения.
Для ссылочных типов 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