Почему компилятор хранит постоянные значения в метаданных сборки? Они непосредственно встроены в код промежуточного языка из метаданных сборки?
c#
clr
compilation
Arun
источник
источник
Ответы:
Лучший способ подумать об этом: «Во время компиляции const преобразуется в литерал, где он используется.
Единственная причина, по которой он входит в манифест в сборке, в которой он был определен, - сделать его доступным для потребителей. Это часть данного типа, и метаданные этого типа хранятся в его сборке, а не в сборках, которые ее потребляют.
Таким образом, это встроенный литерал в потреблении и потребляемое свойство или поле с инкапсулированным типом в метаданных.
источник
Я довольно долго исследовал себя и обнаружил из книги, что это может быть причиной ...
Поскольку значения констант никогда не меняются, константы считаются частью определяющего типа. Поэтому определение констант создает метаданные.
источник
Я думаю, что вы перепутали две сборки.
Константа сохраняется только в метаданных в сборке, где она определена . Метаданные содержат информацию обо всех типах и членах в сборке, а константы являются членами.
Информация о константе не сохраняется в сборке, где она используется . Значение константы используется непосредственно в IL, как если бы вы написали число или строку константы непосредственно в источнике.
Пример: одно из моих приложений использует много констант для идентификации таблиц и полей базы данных. У меня есть одна сборка, которая содержит только все константы.
Когда я собираю приложение, я добавляю ссылку на сборку «константы» в Visual Studio. Поскольку сборка содержит только константы, в моем приложении нет ссылки на нее, и сборка «константы» не требуется во время выполнения.
источник
Константы известны во время компиляции, а затем они сохраняются в метаданных сборки. Это означает, что вы можете определять константы только для примитивных типов.
Да, они напрямую загружаются из метаданных. Там не будет выделение памяти во время выполнения.
источник