En el Design Guidelines for Developing Class Libraries, Microsoft dicen:¿Por qué Microsoft desaconseja los campos readonly con valores mutables?
Do not assign instances of mutable types to read-only fields.
The objects created using a mutable type can be modified after they are created. For example, arrays and most collections are mutable types while Int32, Uri, and String are immutable types. For fields that hold a mutable reference type, the read-only modifier prevents the field value from being overwritten but does not protect the mutable type from modification.
Esto simplemente reitera el comportamiento de sólo lectura sin explicar por qué es malo usar sólo lectura. La implicación parece ser que muchas personas no entienden lo que "solo lee" y esperan erróneamente que los campos de solo lectura sean profundamente inmutables. En efecto, aconseja utilizar "readonly" como documentación de código que indica la inmutabilidad profunda, a pesar de que el compilador no tiene forma de imponer esto, y no permite su uso para su función normal: garantizar que el valor del campo no cambie después de el objeto ha sido construido.
Me siento incómodo con esta recomendación de usar "readonly" para indicar algo distinto de su significado normal entendido por el compilador. Creo que alienta a las personas a malinterpretar el significado de "solo lectura" y, además, a esperar que signifique algo que el autor del código podría no pretender. Siento que no se puede usar en lugares en los que podría ser útil, p. para mostrar que alguna relación entre dos objetos mutables permanece sin cambios durante la vida de uno de esos objetos. La noción de suponer que los lectores no entienden el significado de "solo lectura" también parece estar en contradicción con otros consejos de Microsoft, como la regla "Do not initialize unnecessarily" de FxCop, que asume que los lectores de su código son expertos en el lenguaje y deben saberlo (por ejemplo) los campos bool se inicializan automáticamente a falso, y te impide proporcionar la redundancia que muestra "sí, esto se ha establecido conscientemente en falso, no me olvidé de inicializarlo".
Por lo tanto, ante todo, ¿por qué Microsoft desaconseja el uso de readonly para referencias a tipos mutables? También me gustaría saber:
- ¿Sigues esta directriz de diseño en todos tus códigos?
- ¿Qué esperas cuando ves "readonly" en un código que no has escrito?
100% de acuerdo. Pauta típica de Microsoft. \ * flush \ * –
No puedo decir que estoy libre de prejuicios. ;) Sentí que la respuesta de Anthony, aunque precisa, no decía nada que no estuviera ya indicado en la guía: las referencias de solo lectura a los objetos mutables son malas ... porque el objeto es mutable. Por otro lado, su respuesta al menos dio más detalles sobre por qué es posible que desee tener referencias de solo lectura para objetos mutables. Ahora que lo veo, quizás la respuesta de Stakx es, estrictamente hablando, la respuesta más precisa a la pregunta que originalmente hice. – Weeble