Por que eu não posso ter “public static const String s =” coisas "; na minha classe?
Pergunta
Ao tentar compilar minha classe eu recebo um erro:
O
'NamespaceName.ClassName.CONST_NAME'
constante pode não ser marcado estático.
na linha:
public static const string CONST_NAME = "blah";
Eu poderia fazer isso o tempo todo em Java. O que estou fazendo de errado? E por que não me deixar fazer isso?
Solução
Um objeto const
é sempre static
.
Outras dicas
A partir da linguagem C # especificação (PDF página 287 - ou página 300 do PDF):
Apesar de constantes são considerados membros estáticos, uma constante declaração não requer nem permite um modificador estático.
Um membro const é considerado estático pelo compilador, bem como implicando semântica de valor constante, o que significa que as referências para a constante pode ser compilado no código utilizando-se como o valor do elemento constante, em vez de uma referência para o membro.
Em outras palavras, um membro const contendo o valor 10, pode se compilado no código que usa-lo como o número 10, em vez de uma referência para o membro const.
Isto é diferente de um campo somente leitura estático, que sempre será compilado como uma referência para o campo.
Note, este é pré-JIT. Quando o JIT'ter entra em jogo, pode compilar estes dois no código-alvo como valores.
C # 's const
é exatamente a mesma coisa como final
de Java, exceto que é absolutamente sempre static
. Na minha opinião, não é realmente necessário para uma variável const
ser não-static
, mas se você precisar acessar uma variável const
não static
-ly, você pode fazer:
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;
}
}
Bem, agora eu percebo esta pergunta foi feita há 4 anos, mas desde que eu coloquei em torno de 2 horas de trabalho, que consiste em tentar todos os tipos de diferentes maneiras de responder e formatação de código, para esta resposta, eu ainda estou postando-lo . :)
Mas, para o registro, eu ainda me sinto meio boba.
De MSDN: http://msdn.microsoft.com/en-us /library/acdd6hb7.aspx
... Além disso, enquanto um campo const é uma constante de tempo de compilação , o campo somente leitura pode ser usado para tempo de execução constantes ...
Então, usando estática em campos const é como tentar fazer um estático definido (com #define) em C / C ++ ... Uma vez que é substituído por seu valor em tempo de compilação é claro que é iniciada uma vez para todas as instâncias ( = estático).
const é semelhante à estática podemos acessar ambas as variáveis ??com o nome de classe, mas diff é variáveis ??estáticas podem ser modificados e const não pode.