Константу нельзя пометить как статическую


Ответы:


198

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изменения значения, они могут выйти из строя [ потому что они будут продолжать использовать предыдущее значение ].



9

У вас не может быть static const. Попробуйте использовать readonly вместо const или просто отбросьте static, поскольку const в любом случае подразумевается static.


4

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


3

Все объявления констант неявно статичны, а в спецификации C # указано, что (избыточное) включение модификатора static запрещено. Я считаю, что это сделано для того, чтобы избежать путаницы, которая могла бы возникнуть, если бы читатель увидел две константы, одну объявленную статической, а другую нет - они могли легко предположить, что разница в спецификации подразумевает различие в семантике. При этом нет запрета на избыточное указание модификатора доступа, который также является модификатором по умолчанию, где есть выбор. Например, (конкретный) метод может быть явно помечен как частный, несмотря на то, что он установлен по умолчанию. Кажется, что правило заключается в том, что там, где нет выбора (например, объявление метода в интерфейсе), избыточный модификатор запрещен. Там, где есть выбор, он разрешен.

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