| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Сравнение типов данных |
| Автор: Wanderer2019 23.10.2007, 09:22 | ||||
| Привет! Разбираюсь вот со сравнением... Не могу понять почему:
вернет true а
false при преведении типа int к object происходит преобразование значимого типа данных к ссылочному, отсюда false? что происходит потом? происходит сравнение ссылок... почему тогда в случае со string`ом возвращается true? |
| Автор: Prehistorik 23.10.2007, 09:29 |
| Стринги - это особый объект. Считай, что оператор "==" перегружен для стрингов. |
| Автор: snav 23.10.2007, 09:53 | ||||
Вообще то, это неправильный ответ. В данном случае оператор == вызывается для Object, а не для String, поэтому перегрузка оператора тут ни причем. По умолчанию оператор == производит ссылочное сравнение, т.е. Object.ReferenceEquals(Object, Object). А соль в том, что .NET так хитро работает со строками, что две одинаковые строки всегда имеют одинаковую ссылку. Можешь проверить следующий код:
Переменная b здесь будет равна true. |
| Автор: 1stain 23.10.2007, 09:54 |
| извиняюсь, хню сморозил |
| Автор: tol05 23.10.2007, 10:24 | ||
| snav, отличный ответ!! перед сравнением производится упаковка целых чисел в object, конечно они будут упакованы в разные object тип string - ссылочный, упаковываться не будет, адрес хранения объекта строки останется неизменным. И ReferenceEquals вернет true. Но и этого мало, т.к. в примере используются не объекты строк, а литералы. Оптимизатор компилятора всегда создает только один экземпляр объекта-литерала, а в места его использования подставляет адрес этого объекта. Так что нет никаких шансов получить
даже теоретических snav +1 |
| Автор: ivashkanet 23.10.2007, 11:20 |
Кстати, я на этом багу словил при хранении данных в Hashtable по числовому ключу. Это было в первом фреймворке, так что никаких дикшионари не было... |
| Автор: Wanderer2019 23.10.2007, 11:45 | ||
и я нарвался на неприятности... хорошо, что вовремя спохватился... Всем спасибо за комменты! |