Me gustaría acercarse a esto desde una dirección ligeramente diferente de Jon. Independientemente de si el objeto es un singleton, es el mejor modelo lógicamente como una propiedad en primer lugar?
Se supone que las propiedades representan ... propiedades. (¡El Capitán Obvio ataca de nuevo!) Ya sabes. Color. Longitud. Altura. Nombre. Padre. Todo lo que lógicamente considerarías como propiedad de una cosa.
No puedo concebir un propiedad de un objeto que es lógicamente un Singleton. Quizás hayas pensado en un escenario en el que no había pensado; No he tenido ninguna Dieta Dr. Pepper aún esta mañana. Pero sospecho que esto es un abuso de la semántica del modelo.
¿Puede describir qué es el singleton y por qué cree que es propiedad de algo?
Dicho todo esto, yo mismo uso este patrón con frecuencia; usualmente así:
class ImmutableStack<T>
{
private static readonly ImmutableStack<T> emptystack = whatever;
public static ImmutableStack<T> Empty { get { return emptystack; } }
...
¿Está "vacío" lógicamente una propiedad de una pila inmutable? No. Aquí, el atractivo beneficio de poder decir
var stack = ImmutableStack<int>.Empty;
supera mi deseo de que las propiedades sean lógicamente propiedades. Diciendo
var stack = ImmutableStack<int>.GetEmpty();
just seems weird.
Si es mejor en este caso tener un campo de solo lectura y una propiedad regular, o un ctor estático y un autoprop, parece una pregunta menos interesante que si se trata de una propiedad en primer lugar. En un estado de ánimo "purista", probablemente me pondría del lado de Jon y lo convertiría en un campo de solo lectura. Pero también utilizo frecuentemente el patrón de hacer autoprops con setters privados para objetos lógicamente inmutables, solo por pereza.
¿Cómo es eso de tomar todas las partes de una pregunta?
Estoy totalmente en desacuerdo. Las propiedades automáticas se inventaron para hacer que el código sea más sucinto, lo que hace que el código sea más legible. El argumento de que es un poco más difícil para otros arruinar su diseño no es muy convincente en mi humilde opinión. –
@Philippe: las propiedades automáticas se inventaron para hacer que el código sea más sucinto * donde el código de reemplazo es equivalente al original *. No existe tal equivalencia aquí: está reemplazando una propiedad de solo lectura con una de lectura y escritura, a pesar de que tiene un setter privado. Esto puede parecer trivial, pero prefiero que mi código exprese mis intenciones, y mi intención aquí sería que el valor solo se pueda establecer una vez. La propiedad implementada automáticamente expresa una intención diferente. –
Tiene un punto acerca de la "intención" del colocador, pero al final, para el consumidor de la clase, no hay diferencia alguna. Tener una auto-propiedad con un setter privado es prácticamente lo mismo que tener una propiedad de solo lectura con un campo de respaldo privado. Claro, compila a código diferente, pero es esencialmente el mismo desde el punto de vista del consumidor de la clase. Ahora tengo que abofetearme a mí mismo, porque nunca me han gustado las propiedades automáticas y ahora defiendo su uso (pero ese es un tema para otra pregunta, supongo) –