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

321

Cuando intento compilar mi clase me sale 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?

jjnguy
fuente

Respuestas:

583

Un constobjeto es siempre static.

Joel Coehoorn
fuente
2
const hace que la variable sea constante y no se puede cambiar.
Samuel
66
@jinguy: const significa inherentemente estático: si tiene algún const, ya es estático y, por lo tanto, estático no necesita ser ni puede especificarse.
John Rudy el
8
@jjnguy: ¿Por qué? readonly es en realidad más flexible que el final de Java para las variables: puede configurarlo tantas veces como desee en el constructor, pero no en otro lugar. Eso puede ser muy útil.
Jon Skeet el
67
Los consts están en línea en tiempo de compilación y no están presentes en el objeto de tipo estático en tiempo de ejecución. Las estadísticas no están en línea y viven dentro del objeto tipo. Agrego esto sólo porque nadie ha mencionado la diferencia ...
3
Todavía están presentes en el momento de la ejecución; puede obtenerlos con reflexión, por ejemplo (con GetField).
Jon Skeet el
32

El compilador considera que un miembro constante está estático, lo que 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 usa 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 referencia al campo.

Tenga en cuenta que esto es pre-JIT. Cuando el JIT'ter entra en juego, podría compilar ambos en el código de destino como valores.

Lasse V. Karlsen
fuente
Punto muy importante, que el código compilado supone que el valor constante no cambiará en una versión futura.
PJTraill
6

C # constes exactamente lo mismo que Java final, excepto que es absolutamente siempre static. En mi opinión, no es realmente necesario que una constvariable sea non- static, pero si necesita acceder a una constvariable de manera no- staticsimple, puede hacer lo siguiente:

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 hizo hace 4 años, pero dado que puse alrededor de 2 horas de trabajo, que consiste en probar todo tipo de formas diferentes de respuesta y formato de código, en esta respuesta, todavía la estoy publicando. :)

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

Meowmaritus
fuente
44
Por lo que puedo decir, Java se finalcomporta exactamente como C # readonly, y no como consten absoluto.
Ben Voigt
@jjnguy Gracias por la edición; Realmente no sé por qué elegí esa redacción original.
Meowmaritus
6

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

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

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

uriel
fuente
2

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

soujanya
fuente