Константы в C #


9

Почему компилятор хранит постоянные значения в метаданных сборки? Они непосредственно встроены в код промежуточного языка из метаданных сборки?


1
на самом деле это не решает «почему», но тем не менее интересно: stackoverflow.com/a/2128633/128384
stijn

Я смущен этим вопросом. Где еще они будут храниться, если не в метаданных? Вы можете уточнить вопрос?
Эрик Липперт

Ответы:


4

Лучший способ подумать об этом: «Во время компиляции const преобразуется в литерал, где он используется.

Единственная причина, по которой он входит в манифест в сборке, в которой он был определен, - сделать его доступным для потребителей. Это часть данного типа, и метаданные этого типа хранятся в его сборке, а не в сборках, которые ее потребляют.

Таким образом, это встроенный литерал в потреблении и потребляемое свойство или поле с инкапсулированным типом в метаданных.


2

Я довольно долго исследовал себя и обнаружил из книги, что это может быть причиной ...

Поскольку значения констант никогда не меняются, константы считаются частью определяющего типа. Поэтому определение констант создает метаданные.


1

Я думаю, что вы перепутали две сборки.

Константа сохраняется только в метаданных в сборке, где она определена . Метаданные содержат информацию обо всех типах и членах в сборке, а константы являются членами.

Информация о константе не сохраняется в сборке, где она используется . Значение константы используется непосредственно в IL, как если бы вы написали число или строку константы непосредственно в источнике.

Пример: одно из моих приложений использует много констант для идентификации таблиц и полей базы данных. У меня есть одна сборка, которая содержит только все константы.

Когда я собираю приложение, я добавляю ссылку на сборку «константы» в Visual Studio. Поскольку сборка содержит только константы, в моем приложении нет ссылки на нее, и сборка «константы» не требуется во время выполнения.


2
Это не объясняет, почему константы хранятся в метаданных. Это танцует вокруг почему, но я не думаю, что OP вообще сбивает с толку две сборки. Вы видите это как проблему с двумя сборками, потому что вы используете две сборки, но я не думаю, что практика распространена; Константы обычно определяются в той же сборке, где они используются.
Роберт Харви

@RobertHarvey Ваше предположение о типичном случае переоценивает мастерство многих наших коллег по C #, я неоднократно приходилось объяснять коллегам, что такое const, и почему вы не вызываете их в разных сборках.
Джимми Хоффа

1

Константы известны во время компиляции, а затем они сохраняются в метаданных сборки. Это означает, что вы можете определять константы только для примитивных типов.

Да, они напрямую загружаются из метаданных. Там не будет выделение памяти во время выполнения.


1
Десятичный тип не является примитивным типом, но вы можете создавать десятичные константы. И вы можете создать константы любого ссылочного типа, при условии, что константа равна нулю.
Эрик Липперт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.