Константу не можна позначити як статичну


Відповіді:


197

constпередбачає static(вам не потрібен екземпляр для посилання на constзначення).

Я також хочу додати цей важливий момент: коли ви посилаєтеся на (посилання) на збірку за допомогою public const, це значення копіюється у вашу збірку. Отже, якщо constзначення у збірці, на яку посилається, змінюється, ваша збірка все одно матиме спочатку скомпільоване значення.

Якщо така поведінка не є прийнятною, вам слід подумати про те, щоб зробити поле public static readonlyполем.

Lib.dll, надається у вигляді двійкового файлу:

public class Foo {
    public const int HATS = 42;
    public static readonly int GLOVES = 33;
}

App.exe, посилання Lib.dll:

Foo.HATS    // This will always be 42 even if the value in Lib.dll changes,
            // unless App.exe is recompiled.

Foo.GLOVES  // This will always be the same as Foo.GLOVES in Lib.dll

З MSDN :

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

З DotNetPerls :

DLL. Коли ви використовуєте constполе або декларацію, компілятор C # фактично вбудовує значення constзмінної безпосередньо в код IL. Тому він по суті стирає constяк окрему сутність.

Увага: Якщо програми, які залежать від a const, не перекомпілюються після constзміни значення, вони можуть зламатися [ оскільки вони продовжать використовувати попереднє значення ].


15

Константа є статичною за визначенням.


це застосовується до `final` і в Java
Basheer AL-MOMANI

@ BasheerAL-MOMANI: Ні. Фінал просто незмінний після виклику конструктора. Більше нічого.
juergen d

9

Ви не можете мати статичний const. Спробуйте лише для читання замість const або просто відпустіть "static", оскільки "const" все одно мається на увазі static.


4

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


3

Усі декларації констант неявно статичні, а специфікація C # стверджує, що (надлишкове) включення статичного модифікатора заборонено. Я вважаю, що це для уникнення плутанини, яка могла б статися, якщо читач побачив дві константи, одну оголошену статичною, а іншу ні - вони могли легко припустити, що різниця в специфікації передбачає різницю в семантиці. Сказавши це, немає заборони надмірно вказувати модифікатор доступу, який також є типовим, де є вибір. Наприклад, (конкретний) метод може бути явно позначений як приватний, незважаючи на те, що це за замовчуванням. Здається, правилом є те, що там, де немає вибору (наприклад, оголошення методу в інтерфейсі), надлишковий модифікатор забороняється. Там, де є вибір, це дозволяється.

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