Мне любопытно узнать, все ли преобразования в C # приводят к боксу.
Нет. Только бокс-конверсии приводят к боксу, отсюда и название "бокс-конверсии". Упаковочные преобразования - это все встроенные преобразования из типов значений в ссылочные типы - либо в класс, от которого наследуется тип значения, либо в интерфейс, который он реализует. (Или к интерфейсу, совместимому с интерфейсом, который он реализует, посредством ковариантного или контравариантного преобразования ссылок.)
все ли преобразования - дорогостоящая операция?
Нет. Преобразование идентификаторов не требует затрат, потому что компилятор может их полностью исключить.
Каковы затраты на неявное и явное преобразование ссылок?
Неявные преобразования ссылок не требуют затрат. Компилятор может их полностью исключить. То есть преобразование из Giraffe в его базовый тип Animal или Giraffe в его реализованный тип интерфейса IAmATallMammal является бесплатным.
Явные преобразования ссылок включают проверку во время выполнения, чтобы убедиться, что ссылка действительно ссылается на объект желаемого типа.
Будет ли эта проверка во время выполнения «дорогостоящей» или нет, зависит от вашего бюджета.
можно ли правильно измерить эту стоимость?
Конечно. Решите, какой ресурс важен для вас, скажем, время, а затем внимательно измерьте свое потребление времени с помощью секундомера.
Вопрос, который вы не задавали, но, вероятно, должны иметь:
Какие конверсии самые дорогие?
Пользовательские преобразования - не что иное, как синтаксический сахар для вызова метода; этот метод может длиться сколь угодно долго, как и любой другой метод.
При динамическом преобразовании компилятор снова запускается во время выполнения; компилятору может потребоваться сколь угодно много времени для выполнения анализа типа, в зависимости от того, насколько сложную задачу анализа вы решите бросить на него.
person
Eric Lippert
schedule
20.02.2012