Оператор ==, метод Equal и Object.ReferenceEqual в C#
Сегодня я читал об операторе ==, функции Equal и методе Object.ReferenceEqual.
- Оператор == Используется для проверки равных ссылок.
- Равный метод - используется для проверки равных значений.
- Object.ReferencEqual - используется для проверки равных ссылок.
Я создал тестовое консольное приложение. У меня мало вопросов. Для меня было бы полезно, если бы вы дали мне все ответы.
class Program
{
static void Main(string[] args)
{
int intValue = 5;
string strValue = "5";
Console.WriteLine(string.Format("{0} ", intValue.ToString() == strValue));// Output is TRUE
Console.WriteLine(string.Format("{0} ", intValue.Equals(strValue))); // Output is FALSE
Console.WriteLine(string.Format("{0} ", intValue.ToString().Equals(strValue))); // Output is TRUE
Console.WriteLine(string.Format("{0} ", object.ReferenceEquals(intValue, strValue)));// Output is FALSE
Console.WriteLine(string.Format("{0} ", object.ReferenceEquals(intValue.ToString(), strValue)));// Output is FALSE
Console.Read();
}
У меня есть пять строк в выводе.
Строка 1 - Вывод истина.
По моим сведениям, здесь я занимаюсь кастингом. Так что я получаю TRUE как == оператор проверки ссылок.
Строка 2 - вывод ложен.
Вопрос 1. Равная функция проверки значения объекта. Здесь мы имеем ту же ценность, но я получаю Ложь. ЗАЧЕМ?
Строка 3 - Вывод истина.
Вопрос 2. Здесь я делаю кастинг, поэтому я получаю Истину. ЗАЧЕМ?
Строка 4. Вывод неверен.
Насколько мне известно, оба объекта разного типа. Итак, я получаю ЛОЖЬ.
Строка 5. Вывод неверен.
Вопрос 3. Здесь я делаю кастинг, но все же я получаю Ложь. ЗАЧЕМ?
Вопрос 4. В чем разница между == Operator и Object.ReferenceEqual?
3 ответа
Пожалуйста, очистите свой разум от этих утверждений:
Оператор == Используется для проверки равных ссылок.
Равный метод - используется для проверки равных значений.
И то и другое operator==
а также Equals
можно изменить, чтобы изменить их поведение. поскольку operator==
не является виртуальным, во время компиляции известно, какой метод выбран, но Equals
выбирается во время выполнения на основе типа объекта. (Весь процесс выбора подходящего метода называется разрешением метода)
Строка 1: правда. Так как string.operator==
выбрал компилятор и сравнивает строки, а не их ссылки.
Строка 2: Ложь. Так как int.Equals(object)
выбирается компилятором и object
(strValue
) это строка, а не int
, int
не равно string
так что это неверно.
Строка 3: правда. Так как string.Equals(string)
выбирается компилятором и проверяет равенство значений, а не ссылок.
Строка 4: Ложь. Becuase object.ReferenceEquals
проверяет равенство ссылок, поэтому ответ очевиден.
Строка 5: Ложь. То же, что и выше. intValue.ToString()
создает новый строковый объект в памяти со значением "5", и это не тот же объект, что и strValue
указывает на то, что ответ ложный.
Равная функция проверки значения объекта. Здесь мы имеем ту же ценность, но я получаю Ложь. ЗАЧЕМ?
Объекты другого типа не могут иметь одинаковое значение. Ваш первый объект имеет целочисленное значение 5, в то время как ваш второй объект имеет строковое значение "5"
, строка "5"
является одним из возможных представлений целочисленного значения 5, а именно его десятичного представления. Однако это не одно и то же значение. В конце концов, вы не ожидаете "101"
быть равным 5, хотя 101 является двоичным представлением 5.
Здесь я делаю кастинг, поэтому я получаю True. ЗАЧЕМ?
Вы не выполняете приведение, вы преобразовываете 5 в представление десятичной строки, которое "5"
,
Здесь я делаю кастинг, но все же я получаю Ложь. ЗАЧЕМ?
Потому что вы получаете другой объект с тем же содержимым (а именно, одну строку символов с символом "5"
в этом).
Какая разница между
==
Оператор иObject.ReferenceEqual
?
Object.ReferenceEqual
игнорирует возможные перегрузки оператора ==
,
Вопрос 1: Он возвращает true только если тип имеет тип Int32, но это строка https://msdn.microsoft.com/en-us/library/de3wwa8z(v=vs.110).aspx
Вопрос 2: string.Equals возвращает значение true, если значения одинаковы, каковыми они являются в обоих случаях: "5". https://msdn.microsoft.com/en-us/library/system.string.equals(v=vs.110).aspx
Вопрос 3: они указывают на разные объекты, поэтому ReferenceEqual возвращает false https://msdn.microsoft.com/nl-nl/library/system.object.referenceequals(v=vs.110).aspx
Вопрос 4: == - это то же самое, что и referenceequal, за исключением строки. Но оператор == может быть перегружен, поэтому, если вы хотите проверить личность, используйте ReferenceEquals https://msdn.microsoft.com/nl-nl/library/6a71f45d.aspx