Ответ 1
A const
объект всегда static
.
При попытке скомпилировать мой класс я получаю сообщение об ошибке:
Константа
'NamespaceName.ClassName.CONST_NAME'
не может быть помечена как статическая.
в строке:
public static const string CONST_NAME = "blah";
Я мог бы делать это все время в Java. Что я делаю не так? И почему это не позволяет мне это делать?
A const
объект всегда static
.
Из спецификация языка С# (PDF страница 287 - или 300-я страница PDF):
Несмотря на то, что считаются константы статические члены, константа декларация ни требует, ни позволяет использовать статический модификатор.
Элемент const считается статическим компилятором, а также подразумевает семантику постоянного значения, что означает, что ссылки на константу могут быть скомпилированы в код использования в качестве значения константного элемента вместо ссылки на элемент.
Другими словами, член const, содержащий значение 10, может быть скомпилирован в код, который использует его как число 10 вместо ссылки на член const.
Это отличается от статического поля readonly, которое всегда будет скомпилировано как ссылка на поле.
Обратите внимание, что это pre-JIT. Когда JIT'ter входит в игру, он может скомпилировать оба эти кода в целевой код как значения.
С# const
- это то же самое, что и Java final
, за исключением абсолютно всегда static
. На мой взгляд, не обязательно, чтобы переменная const
была не static
, но если вам нужно получить доступ к переменной const
не static
-ly, вы можете сделать:
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 является константой времени компиляции, поле readonly может использоваться для констант времени выполнения...
Таким образом, использование static в const-полях похоже на попытку сделать определенный (С#define) статичным в C/С++... Так как он заменяется его значением во время компиляции, то он запускается один раз для всех экземпляров ( = статический).
const похож на статический, мы можем обращаться к обеим переменным с именем класса, но diff статические переменные могут быть изменены, а const не может.