Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сравнение типов данных 
V
    Опции темы
Wanderer2019
Дата 23.10.2007, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 937
Регистрация: 3.12.2004
Где: Санкт-Петербург/П рага

Репутация: 7
Всего: 17



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

Код

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

вернет true

а

Код

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


false

при преведении типа int к object происходит преобразование значимого типа данных к ссылочному, отсюда false? что происходит потом? происходит сравнение ссылок... 
почему тогда в случае со string`ом возвращается true?
PM ICQ MSN   Вверх
Prehistorik
Дата 23.10.2007, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 146
Регистрация: 30.5.2006
Где: СПб

Репутация: 2
Всего: 3



Стринги - это особый объект. Считай, что оператор "==" перегружен для стрингов.
--------------------
Есть только один бог - Ассемблер, и С - пророк его. 
PM MAIL   Вверх
Wanderer2019
Дата 23.10.2007, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 937
Регистрация: 3.12.2004
Где: Санкт-Петербург/П рага

Репутация: 7
Всего: 17



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


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

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

Это сообщение отредактировал(а) Wanderer2019 - 23.10.2007, 09:37
PM ICQ MSN   Вверх
snav
Дата 23.10.2007, 09:53 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 8.9.2007

Репутация: 2
Всего: 4



Цитата(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.

Это сообщение отредактировал(а) snav - 23.10.2007, 10:22
PM   Вверх
1stain
Дата 23.10.2007, 09:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 8
Всего: 40



извиняюсь, хню сморозил  smile 

 


Это сообщение отредактировал(а) 1stain - 23.10.2007, 10:08


--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
tol05
Дата 23.10.2007, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



snav, отличный ответ!!

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

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

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

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

snav +1


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
ivashkanet
Дата 23.10.2007, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



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

Кстати, я на этом багу словил при хранении данных в Hashtable по числовому ключу. Это было в первом фреймворке, так что никаких дикшионари не было...
 
PM MAIL WWW ICQ   Вверх
Wanderer2019
Дата 23.10.2007, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 937
Регистрация: 3.12.2004
Где: Санкт-Петербург/П рага

Репутация: 7
Всего: 17



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


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

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

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


PM ICQ MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0524 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.