Мы знаем немало вещей о константах:Почему C# постоянных замещенные
- значение должно быть известно во время компиляции
- значение не может быть изменено во время выполнения
- они проталкиваются внутри объявляющего узла метаданные
- все вхождений заменяются своим значением в IL
- они могут создать серьезные проблемы кросс сборки версий
- они не потребляют динамическую память, так как их значения подставляются в IL коде
- константы могут быть только примитивные типы + любой тип ссылки обнуляются (MSDN не хватает упоминания этой части)
Помимо основных характеристик констант , почему команда clr решила заменить каждое появление постоянных значений литералами? На мой взгляд, дрожание было бы вполне способно загружать содержащую сборку в память, искать тип в метаданных и извлекать правильное и актуальное значение.
Я действительно не верю, что производительность является проблемой здесь, в любом коде есть не так много констант, которые бы того стоили. Не говоря уже о классической проблеме версий сборщиков, содержащих константы.
CLR через C# должен был дать мне чрезмерный ответ, но он просто не сделал этого.
Поскольку они являются константами, его более эффективно испускают код, который будет в конечном счете превратился в 'мов топора, 1234h' изначально, в конечном счете быстрее и эффективнее, чем делать, если поиск все время. Непосредственная адресация быстрее, чем косвенная адресация – MickyD
_ «они могут создать серьезную проблему с версией перекрестного монтажа» _ - только если вы не перекомпилируете все.Как правило, люди должны использовать сервер сборки в любом случае в этот день и в возрасте должного усердного TDD; и серверы CI, а не развертывать из вашего окна DEV, что является единственным способом, я могу думать о том, где вы столкнулись с такой проблемой. – MickyD
«изначально в конечном счете быстрее и эффективнее, чем просмотр постоянно» Bytecode не должен постоянно искать значение. По-моему, при компиляции в IL можно было бы заменить постоянные значения при jitting на байтовый код. Производительность не будет проблемой, так как каждый сборщик должен получить доступ к определяющей сборке один раз, когда будет включен. И вот точка, в которой я изящно противоречу себе :) Таким образом, почти каждое возникновение должно быть просмотрено и заменено на байт-код, поскольку джиттинг обычно происходит на уровне метода. –