¿Cuál es la diferencia entre const, solo lectura y get en una clase estática [duplicado]

Resuelto Thomas Andreè Wang asked hace 11 años • 7 respuestas

Tengo una pregunta. Últimamente me he sorprendido usando 3 líneas de código diferentes que, tras una inspección más cercana, se ven y se sienten iguales.

public static class constant
{
    public static readonly int val1 = 5;
    public const int val2 = 5;
    public static int val3 { get { return 5; } }
}

mi pregunta es, ¿son iguales y se debe usar uno sobre otro? en ese caso. ¿Cuando?

También como pregunta adicional en Visual Studio, ¿por qué todos están representados de manera diferente en Intellisense?

ingrese la descripción de la imagen aquí

Thomas Andreè Wang avatar Sep 03 '13 01:09 Thomas Andreè Wang
Aceptado

El miembro declarado como de solo lectura ofrece la posibilidad de cambiarse en el constructor (estático) de la clase, mientras que el miembro constante no se puede cambiar en tiempo de ejecución.

Declarar un campo como constante lo convierte automáticamente en estático, citando el §10.3.7:

Cuando una declaración de campo, método, propiedad, evento, operador o constructor incluye un modificador estático, declara un miembro estático. Además, una declaración de tipo o constante declara implícitamente un miembro estático.

La tercera es solo una propiedad de solo lectura que siempre devuelve 5.

Nunca debes usar dicha propiedad y preferir miembros constantes siempre que sea posible para permitir que el compilador y/o el jitter realicen sus optimizaciones y para ayudar a otras personas a leer tu código (esa propiedad es una especie de WTF para mí). El miembro estático de solo lectura debe usarse si se requiere un valor constante inicializado durante el inicio del programa (como, por ejemplo, el número de núcleos de una máquina).

Este es un gran ejemplo de las especificaciones de C# (§10.5.2.1):

Un campo estático de solo lectura es útil cuando se desea un nombre simbólico para un valor constante, pero cuando el tipo del valor no está permitido en una declaración constante, o cuando el valor no se puede calcular en tiempo de compilación. en el ejemplo

public class Color
{
    public static readonly Color Black = new Color(0, 0, 0);
    public static readonly Color White = new Color(255, 255, 255);
    public static readonly Color Red = new Color(255, 0, 0);
    public static readonly Color Green = new Color(0, 255, 0);
    public static readonly Color Blue = new Color(0, 0, 255);
    private byte red, green, blue;
    public Color(byte r, byte g, byte b) {
        red = r;
        green = g;
        blue = b;
    }
}

los miembros Negro, Blanco, Rojo, Verde y Azul no pueden declararse como miembros constantes porque sus valores no se pueden calcular en tiempo de compilación. Sin embargo, declararlos estáticos de solo lectura tiene prácticamente el mismo efecto.

Y otra diferencia más (§10.5.2.2):

Las constantes y los campos de solo lectura tienen una semántica de versiones binarias diferente. Cuando una expresión hace referencia a una constante, el valor de la constante se obtiene en tiempo de compilación, pero cuando una expresión hace referencia a un campo de solo lectura, el valor del campo no se obtiene hasta el tiempo de ejecución.

Entonces, en resumen, son muy diferentes, incluso si a primera vista pueden parecer similares y debes usar el que mejor se adapte a tu intención.

BlackBear avatar Sep 02 '2013 18:09 BlackBear

Hola, encontrarás la respuesta a tus preguntas en este post:

Sólo lectura estática vs constante

También puede verificar el código IL e intentar comparar el resultado usted mismo.

Bassam Alugili avatar Sep 02 '2013 18:09 Bassam Alugili