Я намагаюся оголосити константу PI таким:
public static const double PI = Math.PI;
але чому я отримую цю помилку?
The constant 'Calendar.NewCalendar.PI' cannot be marked static
Я намагаюся оголосити константу PI таким:
public static const double PI = Math.PI;
але чому я отримую цю помилку?
The constant 'Calendar.NewCalendar.PI' cannot be marked static
Відповіді:
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зміни значення, вони можуть зламатися [ оскільки вони продовжать використовувати попереднє значення ].
Константа є статичною за визначенням.
Константи не можуть бути замінені в коді під час компіляції, а не під час виконання, тому немає вимог щодо статичних і визначень екземплярів.
Усі декларації констант неявно статичні, а специфікація C # стверджує, що (надлишкове) включення статичного модифікатора заборонено. Я вважаю, що це для уникнення плутанини, яка могла б статися, якщо читач побачив дві константи, одну оголошену статичною, а іншу ні - вони могли легко припустити, що різниця в специфікації передбачає різницю в семантиці. Сказавши це, немає заборони надмірно вказувати модифікатор доступу, який також є типовим, де є вибір. Наприклад, (конкретний) метод може бути явно позначений як приватний, незважаючи на те, що це за замовчуванням. Здається, правилом є те, що там, де немає вибору (наприклад, оголошення методу в інтерфейсі), надлишковий модифікатор забороняється. Там, де є вибір, це дозволяється.