2014-12-03 3 views
1

У меня есть следующий кодConfused о работе равенства в C#

CASE 1 
     string string1 = "pankaj"; 
     string string2 = "pankaj"; 
     Console.WriteLine(string1 == string2); // output TRUE 

CASE 2 
     object obj1 = "pankaj"; 
     object obj2 = "pankaj"; 
     Console.WriteLine(obj1==obj2); // Output TRUE 

CASE 3 
     object againObject1 = 2; 
     object againObject2 = 2; 
     Console.WriteLine(againObject1==againObject2); // Output FALSE 

в виде строки и объекта является типом ссылки и для ссылочного типа я узнал, что операция равенства проверяет, если они имеют один и тот же адрес, в двух указанных выше случае почему его сравнивая значение вместо ссылок.

Чем более запутанным является поведение оператора равенства для типа объекта в случае 2, а в случае 3 для строкового типа он вычисляет true, а для целых - возвращает false.

+0

Из-за оптимизаторов компилятора существует только одна строка, созданная «Pankaj». В случае целых чисел будут созданы два разных объекта. Перейдите по следующему [link] (http://stackoverflow.com/questions/4286614/c-sharp-do-string-literals-get-optimised-by-the-compiler) http://stackoverflow.com/questions/ 4286614/c-sharp-do-string-literals-get-optimized-by-the-compiler – Srikanth

+0

Я думаю, что это потому, что строковые литералы интернированы, поэтому существует только один экземпляр «pankaj». 'Console.WriteLine (object.ReferenceEquals (obj1, obj2));' также вернет true для случая 2. –

+0

Возможный дубликат [Попытка понять == оператор с объектами] (http://stackoverflow.com/questions/25396926/trying-to-understand-operator-with-objects) –

ответ

5

Уравнение строк различно. Среди многих других вещей ...

Пример 1 и 2 в обоих случаях возвращают тот же самый объект - строка INTERNED («pankaj» существует только один раз после интернализации, а все константные строки интернализированы).

Пример 3 имеет 2 предмета в коробке без какой-либо оптимизации - так что 2 поля вокруг типа значения.

+0

После декомпиляции в IL две строки отличаются друг от друга –

+0

Разница исходит из того, что 'Int' является структурой, которая дона 't переопределяет оператор '==', тогда как класс string делает –

+0

Фактически нет, в этом конкретном случае он даже исходит из всех строк, являющихся ОДНОМ ОБЪЕКТОМ из-за интернализации статических строк во время компиляции/загрузки классов. Переопределение строк учитывается только при динамическом создании строк. – TomTom

-1

Класс String имеет переопределенный оператор ==, чтобы реализовать сравнение по значению, а класс Int32 - нет.

+0

Ничего общего в этом случае, случай 2 сравнивает 2 объекта, поэтому согласно вашему объяснению 'obj1 == obj2' будет ложным. –

+0

Все, что связано с этим. –

+0

Нет, нет, читайте ответ TomTom. –

-1

с помощью: object1 == object2 не сравнивая содержимое объекта, вместо того, чтобы это сравнение хранения-адреса, если объект является сравнимые использование object1.equals (Объект2)

0

Строки являются объектами и целыми числами, но более поздними являются type values. Таким образом, пример 3 указывает на два разных места в памяти, и вы пытаетесь сравнить их адреса, бокс их на объекты.

Смежные вопросы