Почему у меня не может быть “public static const string S = ”stuff";в моем Классе?

StackOverflow https://stackoverflow.com/questions/408192

  •  03-07-2019
  •  | 
  •  

Вопрос

При попытке скомпилировать мой класс я получаю сообщение об ошибке:

Постоянная 'NamespaceName.ClassName.CONST_NAME' не может быть помечен как статичный.

на линии:

public static const string CONST_NAME = "blah";

Я мог бы делать это постоянно на Java.Что я делаю не так?И почему он не позволяет мне сделать это?

Это было полезно?

Решение

A const объект всегда static.

Другие советы

Из самого Спецификация языка C # (Страница 287 - или 300-я страница PDF-файла):

Несмотря на то, что константы считаются статическими членами, объявление константы не требует и не допускает статического модификатора.

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

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

Это отличается от статического поля, доступного только для чтения, которое всегда будет компилироваться как ссылка на поле.

Обратите внимание, это pre-JIT.Когда в игру вступает джиттер, он может скомпилировать оба этих параметра в целевой код в виде значений.

C#'ы const это точно то же самое, что и у Java final, за исключением того, что это абсолютно всегда static.На мой взгляд, на самом деле в этом нет необходимости для const переменная, которая не должна быть-static, но если вам нужно получить доступ к const переменная не-static-ли, ты можешь сделать:

class MyClass
{    
    private const int myLowercase_Private_Const_Int = 0;
    public const int MyUppercase_Public_Const_Int = 0;

    /*        
      You can have the `private const int` lowercase 
      and the `public int` Uppercase:
    */
    public int MyLowercase_Private_Const_Int
    {
        get
        {
            return MyClass.myLowercase_Private_Const_Int;
        }
    }  

    /*
      Or you can have the `public const int` uppercase 
      and the `public int` slighly altered
      (i.e. an underscore preceding the name):
    */
    public int _MyUppercase_Public_Const_Int
    {
        get
        {
            return MyClass.MyUppercase_Public_Const_Int;
        }
    } 

    /*
      Or you can have the `public const int` uppercase 
      and get the `public int` with a 'Get' method:
    */
    public int Get_MyUppercase_Public_Const_Int()
    {
        return MyClass.MyUppercase_Public_Const_Int;
    }    
}

Что ж, теперь я понимаю, что этот вопрос был задан 4 года назад, но поскольку я вложил в этот ответ около 2 часов работы, состоящей из пробования всевозможных способов ответа и форматирования кода, я все еще публикую его.:)

Но, между прочим, я все еще чувствую себя немного глупо.

Из MSDN: http://msdn.microsoft.com/en-us/library/acdd6hb7.aspx

...Кроме того, в то время как поле const - это константа времени компиляции, поле только для чтения может использоваться для констант времени выполнения...

Таким образом, использование static в полях const похоже на попытку сделать определенное (с помощью #define) static в C / C ++...Поскольку он заменяется своим значением во время компиляции, конечно, он инициируется один раз для всех экземпляров (= static).

const аналогичен static, мы можем получить доступ к обеим переменным с именем класса, но diff - это статические переменные, которые можно изменять, а const - нет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top