2012-06-01 16 views
9

¿Por qué los diseñadores de C# no permitieron algo como esto?¿Por qué no hay inmutabilidad declarativa en C#?

public readonly class ImmutableThing 
{ 
    ... 
} 

Una de las formas más importantes para el seguro multi-threading es el uso de los objetos inmutables/clases, sin embargo, no hay manera de declarar una clase como inmutable. Sé que puedo hacer que sea inmutable mediante una implementación adecuada, pero hacer que la declaración de clase lo haga cumplir lo haría mucho más fácil y seguro. Comentar una clase como inmutable es, en el mejor de los casos, una solución de "soporte de puerta".

Una ojeada a una declaración de clase e inmediatamente sabría que era inmutable. Si tuviera que modificar el código de otra persona, sabría que una clase no permite cambios por intención. Solo puedo ver ventajas aquí, pero no puedo creer que nadie haya pensado en esto antes. Entonces, ¿por qué no es compatible?

EDITAR

Algunos dicen que esto no es una característica muy importante, pero que en realidad no me convence. Procesadores multinúcleo aparecieron porque el aumento del rendimiento por frecuencia golpeó una pared. Los supercomputadores son máquinas muy multiprocesador. El procesamiento en paralelo es cada vez más importante y es una de las principales formas de mejorar el rendimiento. El soporte para multihilo y procesamiento paralelo en .NET es significativo (varios tipos de bloqueo, grupo de subprocesos, tareas, llamadas asincrónicas, colecciones concurrentes, bloqueo de colecciones, foreach paralelo, PLINQ, etc.) y me parece todo lo que te ayuda a escribir paralelamente el código más fácilmente da una ventaja. Incluso si no es trivial de implementar.

+0

Porque no hay. Sin embargo, estaría bien, y parecería abrir ventanas en el futuro si quieren mejorar el idioma. –

+1

¿No es esto lo que es una 'struct'? (Una clase como entidad con semántica de valor) – FishBasketGordo

+4

@FishBasketGordo, no. –

Respuesta

12

Básicamente, porque es complicado, y como escribió el usuario, las funciones necesitan mucho trabajo de diversas maneras antes de que estén listas para enviar. (Es fácil ser un diseñador del lenguaje sillón - Estoy seguro de que es muy difícil de realmente hacerlo, en un idioma con millones de desarrolladores con bases de códigos críticos que no pueden romperse por los cambios.)

Es complicado para que un compilador verifique que un tipo sea visiblemente inmutable sin ser excesivamente restrictivo en algunos casos. Como ejemplo, String es realmente mutable dentro de mscorlib, pero el código de otros tipos (por ejemplo, StringBuilder) se ha escrito con mucho cuidado para evitar que el mundo exterior alguna vez vea esa mutabilidad.

Eric Lippert tiene written a lot on immutability - es un tema complejo que/se necesita una gran cantidad de trabajo para convertirse en una característica del lenguaje práctico. También es bastante difícil de actualizar en un lenguaje y framework que no lo tenía para empezar.Me encantaría C# para, al menos, hacer más fácil escribir tipos inmutables, y sospecho que el equipo ha pasado bastante tiempo pensando en ello, si alguna vez serán lo suficientemente felices con sus ideas para convertirlo en un lenguaje de producción característica es una cuestión diferente.

+0

¿Por qué no puede un tipo inmutable simplemente significar que cada campo debe declararse de solo lectura? Eso no parece demasiado complicado o difícil, ¿no? –

+3

@KirkWoll: un tipo que tiene un miembro 'StringBuilder' de solo lectura no es tan inmutable como la mayoría de la gente quisiera. Básicamente, la mutabilidad es viral. –

+0

ah, ya veo. No estaba pensando que se aplicaría profundamente. –

5

Las características deben diseñarse, implementarse, probarse, documentarse, implementarse y admitirse. Es por eso que obtenemos las características más importantes primero, y las menos importantes tarde o nunca.

Su propuesta está bien, pero hay una solución fácil (como usted dijo). Por lo tanto, no es una característica "urgente".

También hay una cosa llamada inmutabilidad representacional donde las mutaciones de estado dentro del objeto están permitidas pero nunca son visibles desde el exterior. Ejemplo: un campo calculado de forma lenta. Esto no sería posible en su propuesta porque el compilador nunca podría probar que la clase es inmutable al exterior, aunque su campo se escribe de forma rutinaria.

+1

Sin mencionar que el problema es mucho más difícil de lo que parece, y los problemas más difíciles tienden a retrasarse en favor de los más fáciles. –

+0

@MystereMan: No diría eso, necesariamente. Hay muchas frutas pequeñas y de bajo costo que el equipo de C# * podría haber tomado en lugar de la asincrónica, lo que está lejos de ser un problema "fácil". –

+0

@JonSkeet - Es por eso que dije "Tienden a". Por supuesto, hay excepciones cuando un problema es a) parte del plan de mercadotecnia de una gran cantidad de productos yb) realmente genial;) –

Cuestiones relacionadas