¿Por qué no puedo tener "public static const string S =" stuff " ;; ¿en mi clase?

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

  •  03-07-2019
  •  | 
  •  

Pregunta

Al intentar compilar mi clase, aparece un error:

  

La constante 'NamespaceName.ClassName.CONST_NAME' no se puede marcar como estática.

en la línea:

public static const string CONST_NAME = "blah";

Podría hacer esto todo el tiempo en Java. ¿Qué estoy haciendo mal? ¿Y por qué no me deja hacer esto?

¿Fue útil?

Solución

Un objeto const siempre es static .

Otros consejos

De la especificación del lenguaje C # (PDF página 287 o la página 300 del PDF):

  

A pesar de que las constantes son consideradas   miembros estáticos, una constante   declaración ni requiere ni   permite un modificador estático.

Un compilador se considera estático por el compilador, así como implica una semántica de valor constante, lo que significa que las referencias a la constante podrían compilarse en el código de uso como el valor del miembro constante, en lugar de una referencia al miembro.

En otras palabras, un miembro const que contiene el valor 10, podría compilarse en un código que lo use como el número 10, en lugar de una referencia al miembro const.

Esto es diferente de un campo de solo lectura estático, que siempre se compilará como una referencia al campo.

Nota, esto es pre-JIT. Cuando el JIT'ter entra en juego, puede compilar ambos en el código objetivo como valores.

El const de

C # es exactamente lo mismo que el final de Java, excepto que siempre es static . En mi opinión, no es realmente necesario que una variable const no sea static , pero si necesita acceder a una variable const no static -ly, puedes hacerlo:

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;
    }    
}

Bueno, ahora me doy cuenta de que esta pregunta se formuló hace 4 años, pero dado que dediqué alrededor de 2 horas de trabajo, que consiste en probar todo tipo de formas diferentes de responder y formatear códigos, en esta respuesta, todavía lo publico. . :)

Pero, para que conste, todavía me siento un poco tonto.

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

... Además, mientras un campo de const es una constante de compilación , el campo de solo lectura se puede usar para las constantes de tiempo de ejecución ...

Por lo tanto, usar estática en campos const es como intentar hacer una estática definida (con #define) en C / C ++ ... Ya que se reemplaza con su valor en tiempo de compilación, por supuesto, se inicia una vez para todas las instancias ( = estático).

const es similar a static, podemos acceder a ambas variables con el nombre de clase, pero diff es que las variables estáticas se pueden modificar y const no.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top