Оператор ==, метод 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

Другие вопросы по тегам