Почему у меня не может быть "public static const string S =" stuff "в моем классе? - PullRequest
281 голосов
/ 03 января 2009

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

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

в строке:

public static const string CONST_NAME = "blah";

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

Ответы [ 6 ]

520 голосов
/ 03 января 2009

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

87 голосов
/ 03 января 2009

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

Даже если константы считаются статические члены, константа декларация не требует и не требует позволяет статический модификатор.

32 голосов
/ 03 января 2009

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

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

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

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

5 голосов
/ 30 сентября 2013

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

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

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

5 голосов
/ 20 марта 2013

C # const - это то же самое, что и final в Java, за исключением того, что оно абсолютно всегда 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 часов работы, состоящей из попыток различных способов ответа и форматирования кода, в этот ответ, я все еще публикую его , :)

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

2 голосов
/ 07 июня 2013

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

...