|
14 / 14 / 3
Регистрация: 07.01.2014
Сообщений: 37
|
||||||
Разница между == и Equals()22.01.2014, 08:39. Показов 10444. Ответов 13
Метки нет (Все метки)
Если менять переменную newAge на int тогда true. Может кто объяснить почему так?
0
|
||||||
| 22.01.2014, 08:39 | |
|
Ответы с готовыми решениями:
13
Equals и == в чем разница?
разница между C# и C++ |
|
|
|||||||
| 22.01.2014, 08:47 | |||||||
|
P.S: Все что я написал выше просто предположение. Добавлено через 3 минуты На msdn говорят что Equals нужно писать вот так:
2
|
|||||||
|
Администратор
|
||||||
| 22.01.2014, 10:07 | ||||||
|
Вот вам небольшой листинг для размышления, я разбирался с этой темой и писал вот этот код. Комментарии прилагаются.
Кликните здесь для просмотра всего текста
Чтобы хорошо разобраться в теме, рекомендую прочитать главу об этом в книге Джеффри Рихтера "CLR via C#"
4
|
||||||
|
14 / 14 / 3
Регистрация: 07.01.2014
Сообщений: 37
|
||||||
| 22.01.2014, 10:45 [ТС] | ||||||
|
Оказывается метод Equal не был предназначен для типа short
Написал следующий код, возвращает true
0
|
||||||
|
11 / 10 / 8
Регистрация: 06.07.2015
Сообщений: 75
|
||||||
| 30.03.2017, 19:57 | ||||||
|
Тема древняя!!!
Но меня вот что заинтересовало. Почему код так работает?
PS. И почему у автора темы в первом случае false сработало?
0
|
||||||
|
|
||
| 30.03.2017, 20:39 | ||
|
Во втором случае очевидно, что false, т.к. p1 и p2 - valuetypes. Пусть меня поправят более опытные коллеги, потому что я не до конца уверен в своей правоте..
1
|
||
|
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
|
||||||
| 30.03.2017, 21:00 | ||||||
|
Дело не с особенностями компилятора, а в том, как Int16 реализует Equals method:
C referencesource.microsoft.com:
Соответственно при передаче Int16 просто сравниваются значения. Получается, если во втором случае скастить Int32 к Int16, то получим ожидаемый результат: Console.WriteLine(p2.Equals((short)p1)); //true
1
|
||||||
|
11 / 10 / 8
Регистрация: 06.07.2015
Сообщений: 75
|
|
| 30.03.2017, 21:20 | |
|
Да , но почему в первом случае вызывается метод:
public bool Equals(Int16 obj) Ведь по идее должен вызываться: public override bool Equals(Object obj)
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 30.03.2017, 21:22 | ||
|
Вызывается он потому, что short неявно преобразуется в int, а перегрузка с int является лучшим кандидатом, чем перегрузка с object.
0
|
||
|
11 / 10 / 8
Регистрация: 06.07.2015
Сообщений: 75
|
|
| 30.03.2017, 21:38 | |
|
Ничего подобного. Декомпилятор показывает вызов метода:
instance bool [mscorlib]System.Int16::Equals(int16)
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 30.03.2017, 22:20 | ||
|
Age — константа, к тому же ее значение входит в диапазон short. В этом случае int неявно преобразуется в short.
2
|
||
|
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
|
|||||||||||
| 30.03.2017, 22:37 | |||||||||||
|
Silvestor, таки заставили в IL лезти,
Вот такой C# код:
То есть ятп С# компилятор преобразует целочисленные константы всегда в Int32. Рихтер также писал, что компилятор при арифметических операциях всегда оперирует 32-битными значениями. Несмотря на то, что IL показывает вызов System.System.Int16::Equals(int16), по факту данные содержат 32-х битные значения (в этом мы только что убедились). А в рантайме Jitter доделывает всю работу. Tsin, получается, вы были правы. Добавлено через 7 минут Хотя не, намудрил, ненужную работу сделал, , В первом случае int преобразуется в short, и срабатывает перегрузка c short параметром, во втором - уже с object параметром.
2
|
|||||||||||
|
11 / 10 / 8
Регистрация: 06.07.2015
Сообщений: 75
|
|
| 30.03.2017, 22:51 | |
|
Господа, тогда правильно ли я понимаю, что выбор выполняемого метода происходит на стадии компиляции в зависимости от типа константы!!? и от значений помещенных в них?
То есть, от типа константы newAge выбирается, что метод Equals будет вызываться для типа int16. Далее от типа и значения константы age выбирается версия перегруженного метода. И если бы в типе int16 была версия Equals с параметром int32, то вызвалась бы именно она. Но... так как представлены только версии с параметрами int16 и object, то компилятор решает вызывать версию с параметром int16 если значение константы менее 65000(2^16), и версию с параметром object если значение константы больше 65000, так как будет потеря данных. Правильны ли мои суждения?
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||
| 30.03.2017, 23:08 | |||
|
Разве что компилятор не думает о потерях данных, а выбирает перегрузку по принципу "преобразуется ли аргумент неявно к типу параметра метода и какое из преобразований более специализировано". Значения константы int, которые попадают в диапазон short, неявно преобразуются в этот тип, потому перегрузка с short и получается лучшим кандидатом.
3
|
|||
| 30.03.2017, 23:08 | |
|
Помогаю со студенческими работами здесь
14
Разница между С# и С++ Разница между VB .NET и С# Разница между this и base Разница между числами
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
|
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение:
DISM / Online / Add-Capability / CapabilityName:WMIC~~~~
Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
|
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: при создании документов установить период списания автоматически. . .
|
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2.
Задача: вывести данные из ТЧ нетипового документа. . .
|
|
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению.
На форме документа создается. . .
|
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
|
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
|
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
|