Por que eu não posso ter “public static const String s =” coisas "; na minha classe?

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

  •  03-07-2019
  •  | 
  •  

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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top