Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Сравнение типов данных


Автор: Wanderer2019 23.10.2007, 09:22
Привет!
Разбираюсь вот со сравнением...
Не могу понять почему:

Код

bool test = ((object)"1" == (object)"1");

вернет true

а

Код

bool test = ((object)1 == (object)1);


false

при преведении типа int к object происходит преобразование значимого типа данных к ссылочному, отсюда false? что происходит потом? происходит сравнение ссылок... 
почему тогда в случае со string`ом возвращается true?

Автор: Prehistorik 23.10.2007, 09:29
Стринги - это особый объект. Считай, что оператор "==" перегружен для стрингов.

Автор: Wanderer2019 23.10.2007, 09:33
Цитата(Prehistorik @  23.10.2007,  09:29 Найти цитируемый пост)
Стринги - это особый объект. Считай, что оператор "==" перегружен для стрингов.


т.е. и всего то??? никаких интересных процессов с приведением типов и т.д. не происходит??? 

ok..
почему тогда инты так сравниваются?

Автор: snav 23.10.2007, 09:53
Цитата(Prehistorik @ 23.10.2007,  09:29)
Стринги - это особый объект. Считай, что оператор "==" перегружен для стрингов.

Вообще то, это неправильный ответ. В данном случае оператор == вызывается для Object, а не для String, поэтому перегрузка оператора тут ни причем. По умолчанию оператор == производит ссылочное сравнение, т.е. Object.ReferenceEquals(Object, Object). А соль в том, что .NET так хитро работает со строками, что две одинаковые строки всегда имеют одинаковую ссылку. Можешь проверить следующий код:
Код
string s1 = "abcd";
string s2 = "abcd";

bool b = object.ReferenceEquals(s1, s2);

Переменная b здесь будет равна true.

Автор: 1stain 23.10.2007, 09:54
извиняюсь, хню сморозил  smile 

 

Автор: tol05 23.10.2007, 10:24
snav, отличный ответ!!

перед сравнением производится упаковка целых чисел в object, конечно они будут упакованы в разные object

тип string - ссылочный, упаковываться не будет, адрес хранения объекта строки останется неизменным. И ReferenceEquals вернет true.
Но и этого мало, т.к. в примере используются не объекты строк, а литералы. Оптимизатор компилятора всегда создает только один экземпляр объекта-литерала, а в места его использования подставляет адрес этого объекта. Так что нет никаких шансов получить
Код

bool test = ((object)"1" == (object)"1");//false

даже теоретических  smile 

snav +1

Автор: ivashkanet 23.10.2007, 11:20
Цитата(Wanderer2019 @  23.10.2007,  09:22 Найти цитируемый пост)
    
bool test = ((object)1 == (object)1);

Кстати, я на этом багу словил при хранении данных в Hashtable по числовому ключу. Это было в первом фреймворке, так что никаких дикшионари не было...
 

Автор: Wanderer2019 23.10.2007, 11:45
Цитата(ivashkanet @  23.10.2007,  11:20 Найти цитируемый пост)
Кстати, я на этом багу словил при хранении данных в Hashtable по числовому ключу. Это было в первом фреймворке, так что никаких дикшионари не было...


и я нарвался на неприятности... 

хорошо, что вовремя спохватился...

Всем спасибо за комменты!


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)