Вопрос очень запутанный.
Означает ли определение экземпляра как динамического в C #:
Под "определением экземпляра" вы подразумеваете "объявление переменной"?
Компилятор не выполняет проверку типов во время компиляции, но проверка во время выполнения происходит так же, как и всегда для всех экземпляров.
Что вы подразумеваете под "проверкой во время выполнения, как это всегда происходит"? Какую проверку во время выполнения вы имели в виду? Вы думаете о проверке, выполненной IL-верификатором , или вы думаете о проверках типа во время выполнения, вызванных приведениями, или как?
Возможно, было бы лучше просто объяснить, что делает "динамический".
Прежде всего, динамический с точки зрения компилятора a типа . С точки зрения CLR , не существует такой вещи, как dynamic ; к тому времени, когда код фактически выполняется, все экземпляры «dynamic» были заменены на «object» в сгенерированном коде.
Компилятор обрабатывает выражения типа dynamic точно как выражения типа object , за исключением того, что все операции над значением этого выражения анализируются, компилируются и выполняются во время выполнения на основе типа времени выполнения экземпляра. Цель состоит в том, чтобы выполняемый код имел ту же семантику , как если бы компилятор знал типы времени выполнения во время компиляции.
Ваш вопрос, кажется, о производительности.
Лучший способ ответить на вопросы производительности - это попробовать и выяснить - что вам нужно сделать, если вам нужны точные числа, это написать код в обоих направлениях, используя динамические и известные типы, а затем достаньте секундомер и сравните время. Это единственный способ узнать.
Однако давайте рассмотрим влияние некоторых операций на производительность на абстрактном уровне. Предположим, у вас есть:
int x = 123;
int y = 456;
int z = x + y;
На большинство аппаратных средств добавление двух целых чисел занимает около одной миллиардной доли секунды.
Что произойдет, если мы сделаем его динамичным?
dynamic x = 123;
dynamic y = 456;
dynamic z = x + y;
Теперь, что это делает во время выполнения? Это блоки 123 и 456 в объекты, которые выделяют память в куче и делают несколько копий.
Затем он запускает DLR и спрашивает DLR "был ли этот кодовый сайт скомпилирован один раз с типами для x и y, являющимися int и int?"
Ответ в этом случае - нет. Затем DLR запускает специальную версию компилятора C #, которая анализирует выражение сложения, выполняет разрешение перегрузки и выплевывает дерево выражений , описывающее лямбду, которая складывает два целых числа. Затем DLR компилирует эту лямбду в динамически сгенерированный IL, который затем jit компилятор выполняет. Затем DLR кэширует это скомпилированное состояние, так что секунда раз, когда вы спрашиваете, компилятору не нужно делать всю эту работу снова.
Это займет дольше , чем наносекунда. Это может занять много тысяч наносекунд.
Это отвечает на ваши вопросы? Я не совсем понимаю, о чем вы здесь спрашиваете, но я делаю лучшее предположение.