Pregunta

En .Net qué se String.Empty leer sólo que en lugar de una constante? Me pregunto si alguien sabe lo que el razonamiento era detrás de esa decisión.

¿Fue útil?

Solución

La razón de que static readonly se utiliza en lugar de const se debe utilizar con código no administrado, como se indica por Microsoft aquí en la Código compartido Common Language Infrastructure 2.0 Release . El archivo que mirar es sscli20\clr\src\bcl\system\string.cs.

  

La constante de vacío mantiene el vacío   valor de cadena. Tenemos que llamar a la   constructor de cadena para que la   compilador no marca esto como una   literal.

     

Marcado esto como un literal significaría   que no se presenta como un campo   los cuales podemos acceder desde nativa.

He encontrado esta información de este artículo a mano en CodeProject .

Otros consejos

Creo que hay mucha confusión y malas respuestas aquí.

En primer lugar, los campos son const static miembros ( no miembros de instancia ).

Consulte la sección 10.4 Constantes de la especificación del lenguaje C #.

  

A pesar de que se consideran constantes   miembros estáticos, una constante en la declaración   ni exige ni permite una estática   modificador.

Si public const miembros son estáticos, no se podía considerar que una constante creará un nuevo objeto.

Ante esto, las siguientes líneas de código hacer exactamente lo mismo en lo que respecta a la creación de un nuevo objeto.

public static readonly string Empty = "";
public const string Empty = "";

Aquí hay una nota de Microsoft que explica la diferencia entre el 2:

  

La palabra clave es diferente de sólo lectura   la palabra clave const. Un campo puede const   Sólo ser inicializado en la declaración   en el campo. Un campo de sólo lectura puede ser   inicializado ya sea en la declaración   o en un constructor. Por lo tanto,   campos de sólo lectura pueden tener diferentes   valores dependiendo del constructor   usado. Asimismo, si bien un campo const es una   tiempo de compilación constante, el de sólo lectura   campo se puede utilizar para el tiempo de ejecución   constantes, ...

Así que me parece que la única respuesta plausible aquí es de Jeff Yates.

String.Empty read only instead of a constant?

Si haces cualquier cadena constante , entonces el compilador es reemplazar con la realidad cadena en todas partes lo llamas y surte su código con la misma cadena por todas partes y cuando el código se ejecuta también se necesita leer una y otra vez que la cadena a partir de los diferentes datos de la memoria.

Si deja su cadena de sólo lectura en un solo lugar, ya que es la String.Empty, el programa de mantener la misma cadena en un solo lugar y leerlo, o se refieren a ella -. Manteniendo los datos en la memoria mínima

Además, si se compila cualquier DLL utilizando el String.Empty como const, y por cualquier motivo el cambio String.Empty, a continuación, el archivo DLL compilado no va a funcionar nunca más el mismo, debido a que el cost hacer que el código dentro de realidad guardar una copia de la cadena en cada llamada.

Vea este código, por ejemplo:

public class OneName
{
    const string cConst = "constant string";
    static string cStatic = "static string";
    readonly string cReadOnly = "read only string";

    protected void Fun()
    {
        string cAddThemAll ;

        cAddThemAll = cConst;
        cAddThemAll = cStatic ;
        cAddThemAll = cReadOnly;    
    }
}

se procederá por el compilador como:

public class OneName
{
    // note that the const exist also here !
    private const string cConst = "constant string";
    private readonly string cReadOnly;
    private static string cStatic;

    static OneName()
    {
        cStatic = "static string";
    }

    public OneName()
    {
        this.cReadOnly = "read only string";
    }

    protected void Fun()
    {
        string cAddThemAll ;

        // look here, will replace the const string everywhere is finds it.
        cAddThemAll = "constant string";
        cAddThemAll = cStatic;
        // but the read only will only get it from "one place".
        cAddThemAll = this.cReadOnly;

    }
}

y la llamada montaje

        cAddThemAll = cConst;
0000003e  mov         eax,dword ptr ds:[09379C0Ch] 
00000044  mov         dword ptr [ebp-44h],eax 
        cAddThemAll = cStatic ;
00000047  mov         eax,dword ptr ds:[094E8C44h] 
0000004c  mov         dword ptr [ebp-44h],eax 
        cAddThemAll = cReadOnly;
0000004f  mov         eax,dword ptr [ebp-3Ch] 
00000052  mov         eax,dword ptr [eax+0000017Ch] 
00000058  mov         dword ptr [ebp-44h],eax 

Editar: Corregido error tipográfico

Existe esta respuesta para fines históricos.

Originalmente:

Debido String es una clase y por lo tanto no puede ser una constante.

discusión extendida:

Una gran cantidad de diálogo útil se forjó en la verificación de esta respuesta, y en lugar de eliminarlo, este contenido se reproduce directamente:

  

En .NET, (a diferencia de Java) y la cadena de cadena son exactamente lo mismo. Y sí, puede tener constantes de cadena literales en .NET - DrJokepu Feb 3 '09 a las 16:57

     

¿Quiere decir que una clase no puede tener constantes? - StingyJack Feb 3 '09 a las 16:58

     

Sí, los objetos tienen que utilizar sólo lectura. Sólo pueden hacer estructuras constantes. Creo que cuando se utiliza en lugar de string <=> el compilador cambia la const en un solo lectura para usted. Todo tiene que ver con el mantenimiento de los programadores de C feliz. - Garry Shutler Feb 3 '09 a las 16:59

     

tvanfosson acaba de explicar un poco más detallado. "X no puede ser una constante, debido a que la Y que contiene es una clase" era sólo un poco demasiado libre de contexto;) - Leonidas Feb 3 '09 a las 17:01

     

String.Empty es propiedad estática que devuelve una instancia de la clase String, a saber, la cadena vacía, no la propia clase cadena. - tvanfosson Feb 3 '09 a las 17:01

     

vacío es una instancia de sólo lectura (no es una propiedad) de la clase String. - Senfo Feb 3 '09 a las 17:02

     

Cabeza daño. Todavía pienso que estoy bien, pero ahora estoy menos seguro. Investigación necesaria esta noche! - Garry Shutler Feb 3 '09 a las 17:07

     

La cadena vacía es una instancia de la clase string. Vacío es un campo estático (no una propiedad, mi error) en la clase String. Básicamente la diferencia entre un puntero y lo que apunta. Si no fuera sólo lectura podríamos cambiar cuyo caso el campo vacío se refiere a. - tvanfosson Feb 3 '09 a las 17:07

     

Garry, que no es necesario hacer ninguna investigación. Piénsalo. Cadena es una clase. Vacío es un ejemplo de una cadena. - Senfo 3 feb '09 a las 17:12

     

Hay algo que no entiendo muy: ¿Cómo es posible el constructor estático de la clase String crear una instancia de la clase String? No es que algún tipo de escenario "huevo o la gallina"? - DrJokepu Feb 3 '09 a las 17:12   5

     

Esta respuesta sería correcta para casi cualquier otra clase, pero System.String. .NET hace un montón de actuación especial-carcasa para cuerdas, y una de ellas es que se puede tener constantes de cadena, a modo de prueba. En este caso, Jeff Yates tiene la respuesta correcta. - Joel Mueller Feb 3 '09 a las 19:25

     

Como se describe en §7.18, una constante-expresión es una expresión que se puede evaluar completamente en tiempo de compilación. Dado que la única manera de crear un valor no nulo de un tipo de referencia distinto de cadena es aplicar el nuevo operador, y puesto que el nuevo operador no está permitido en una constante-expresión, el único valor posible para las constantes de referencia de tipos aparte de cadena es nula. Los dos comentarios anteriores fueron tomadas directamente de la especificación del lenguaje C # y reiteran lo menciona Joel Mueller. - Senfo 4 '09 Feb a las 15:05   5

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