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


9

Чому компілятор зберігає постійні значення в метаданих збірки? Чи вони безпосередньо вбудовані в код проміжного мови з метаданих збірки?


1
це не реально вирішити «чому» , але тим не менш цікаво: stackoverflow.com/a/2128633/128384
Стейн

Мене бентежить це питання. Де б вони ще зберігалися, якби не метадані? Чи можете ви уточнити питання?
Ерік Ліпперт

Відповіді:


4

Найкращий спосіб подумати про це, я знаходжу: У момент компіляції const перетворюється на буквальний, де він використовується.

Єдиною причиною, по якій вона вступає в маніфест, у складі, визначеному ним, було зробити його доступним для споживачів. Це частина даного типу, і метадані цього типу зберігаються в його складі, а не в зборах, які споживають його.

Отже, це лінійний літерал у споживанні та властивість або поле, що вбудовується у метадані.


2

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

Оскільки постійні значення ніколи не змінюються, константи вважаються частиною визначального типу. Тому визначення констант створює метадані.


1

Я думаю, ви змішуєте дві збірки.

Константа зберігається лише у метаданих у складі, де вона визначена . Метадані містять інформацію про всі типи та членів у зборах, а константи є членами.

Інформація про константу не зберігається в збірці, де вона використовується . Постійне значення використовується безпосередньо в ІЛ так само, як якщо б ви записали постійне число або рядок прямо в джерело.

Приклад: Одне з моїх додатків використовує безліч констант для ідентифікації таблиць та полів баз даних. У мене є одна збірка, яка містить лише всі константи.

Коли я будую додаток, додаю посилання на збірку "константи" у Visual Studio. Оскільки збірка містить лише константи, у моїй програмі немає посилання на неї, а збірка "константи" не потрібна під час виконання.


2
Це насправді не пояснює, чому константи зберігаються у метаданих, хоча. Він танцює навколо чому, але я не думаю, що ОП взагалі заплутує дві збірки. Ви бачите це як питання про дві збірки, оскільки ви використовуєте дві збірки, але я не думаю, що така практика є загальною; константи, як правило, визначаються в тій же збірці, де вони використовуються.
Роберт Харві

@RobertHarvey Ваша презумпція типового випадку завищує майстерність багатьох наших колективних колективів C #, мені вже багато разів доводилося пояснювати, що таке суперечка колегам і чому ви не називаєте їх на всіх зборах.
Джиммі Хоффа

1

Константи відомі під час компіляції, а потім вони зберігаються у метаданих збірки. Це означає, що ви можете визначати константи лише для примітивних типів.

Так, вони безпосередньо завантажуються з метаданих. Розподіл пам'яті під час виконання не було б.


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