Comportamiento extraño de variables estáticas de solo lectura y colección en C#

Creé una clase siguiente dentro de un espacio de nombres Global

namespace Global
{
    public static class Status
    {
        public static readonly char Active;
        public static readonly char Suspended;
        public static readonly char Terminiated;
        public static readonly char Deleted;

        private static readonly Dictionary<char, string> statusCollection;
        public static Dictionary<char, string> StatusCollection 
        { 
            get 
            { 
                return statusCollection; 
            }
        }

        static Status()
        {
            statusCollection = new Dictionary<char, string>();
            statusCollection.Add('A', "Active");
            statusCollection.Add('S', "Suspended");
            statusCollection.Add('T', "Terminated");
            statusCollection.Add('D', "Deleted");

            Active = 'A';
            Suspended = 'S';
            Terminiated = 'T';
            Deleted = 'D';
        }
    }

    public class a
    {
        public void add()
        {
            //How to make this collection readonly
            Status.StatusCollection.Add('N', "asd"); 

            Status.Active = 'M'; //Throws a compile time exception, changes not allowed
        }
    }
}

Comportamiento extraño Cuando intenté actualizar Status.Active en la ventana inmediata, esperaba que el valor no cambiara, pero se permitieron cambios. ¿Eso significa que podemos cambiar el valor de readonly variable a través de la reflexión o el tiempo de ejecución?

preguntado el 30 de junio de 12 a las 19:06

Por cierto, aquí es otra delicia con respecto readonly campos, esta vez en estructuras... -

1 Respuestas

Sí, puede cambiar el valor de un readonly propiedad en tiempo de ejecución a través de Reflection. Y aquí hay un POC muy simple:

public class Program
{
    private static readonly string Foo = "Bar";

    static void Main()
    {
        typeof(Program)
            .GetField("Foo", BindingFlags.Static | BindingFlags.NonPublic)
            .SetValue(null, "new value");
        Console.WriteLine(Foo);
    }
}

Cuando ejecute esta aplicación de consola, imprimirá:

new value

Respondido el 30 de junio de 12 a las 19:06

¿Es un hilo para una aplicación en ese caso? ¿Este caso se aplica también a las constantes? Creo que no podemos cambiar las constantes porque se configuran en tiempo de compilación y cada dll mantiene su propia copia. ¿Es eso cierto? - Shantanu Gupta

No, esto no se aplica a las constantes. Se hornean en los metadatos del ensamblaje en el momento de la compilación y no puede cambiar su valor de ninguna manera posible, ni siquiera con Reflection. En cuanto a su primera pregunta si se trata de un hilo, querías decir amenaza? Si quisiste decir amenaza, entonces dependerá de la situación. - darin dimitrov

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.