Por las conversaciones, creo que el equipo C# entiende que han hecho más fácil escribir tipos mutables sin proporcionar un beneficio similar para tipos inmutables. No es que hayan endurecido la inmutabilidad con el tiempo, simplemente no lo han hecho más fácil ... excepto por los tipos anónimos, que son inmutables, pero tienen otros inconvenientes. Desde luego, no me gustaría que se quiten las propiedades automáticas, donde son apropiadas, son realmente útiles. Me encantaría tener el equivalente para las propiedades de solo lectura (lo que les permite establecerse solo en el constructor).
He encontrado que los argumentos nombrados de C# 4 y los parámetros opcionales han hecho que sea más fácil construir instancias de tipo inmutables: aún puede obtener muchos de los beneficios de los inicializadores de objetos, sin los inconvenientes de mutabilidad. Simplemente proporcione los valores predeterminados para los aspectos de su tipo que sean realmente opcionales, deje el resto como parámetros de constructor obligatorios y la persona que llama puede hacer lo que quiera, utilizando argumentos con nombre para agregar claridad.
Los inicializadores de recopilación son una tuerca más difícil de descifrar, desafortunadamente. Me gustaría ver "encadenados" inicializadores que podría trabajar con colecciones inmutables, de modo que en lugar de llamar repetidamente Add
en la misma instancia, el compilador podría crear las llamadas a Plus
las cuales sumadas juntas:
ImmutableList<string> x = new ImmutableList<string> { "a", "b", "c" };
irían a :
ImmutableList<string> x = new ImmutableList<string>().Plus("a")
.Plus("b")
.Plus"(c");
por supuesto, sería bueno tener colecciones más inmutables en el marco de comenzar con :)
Nada de esto ayuda en el lado auto-props, por supuesto. Tengo que admitir que he estado engañando una cierta cantidad recientemente, fingiendo inmutabilidad utilizando emisores privados:
public string Name { get; private set; }
Me hace sentir sucia, sin embargo, no por lo que es verdaderamente inmutable cuando esa es mi intención real.
Básicamente, estoy diciendo que siento tu dolor, y estoy bastante seguro de que el equipo de C# lo hace. Sin embargo, tenga en cuenta que tienen recursos limitados, y diseñar un lenguaje es muy difícil.
Puede que encuentre interesante el videos from NDC 2010 - hay una gran mesa redonda con Eric Lippert, Mads Torgersen, Neal Gafter (y yo), y mis propuestas para C# 5 están en otro video.
No todos los tipos deben ser inmutables. Es perfectamente común (y saludable) tomar un tipo mutable en un constructor, luego copiarlo a un miembro privado. Luego está protegido contra cambios a través de un código externo (suponiendo que haga lo mismo para cualquier dependencia mutable). Esto es especialmente cierto para objetos de datos antiguos. –