Я бы подошел к этому немного в другом направлении, чем Джон. Независимо от того, является ли объект одноэлементным, логически лучше всего его моделировать как свойство в первую очередь?
Свойства должны представлять ... свойства. (Капитан Очевидный снова наносит удар!) Вы знаете. Цвет. Длина. Рост. Название. Родитель. Все вещи, которые вы бы логически считали собственностью вещи.
Я не могу представить свойство объекта, который логически является singleton . Может быть, вы придумали сценарий, о котором я не подумал; У меня еще не было диеты, доктор Пеппер сегодня утром. Но я подозреваю, что это злоупотребление семантикой модели.
Можете ли вы описать, что такое синглтон, и почему вы считаете, что он является собственностью чего-то?
Все, что сказано, я сам часто использую эту модель; обычно так:
class ImmutableStack<T>
{
private static readonly ImmutableStack<T> emptystack = whatever;
public static ImmutableStack<T> Empty { get { return emptystack; } }
...
Является ли "Empty" логически свойством неизменного стека? Нет. Здесь убедительная выгода от умения сказать
var stack = ImmutableStack<int>.Empty;
превосходит мое желание, чтобы свойства логически были свойствами. Высказывание
var stack = ImmutableStack<int>.GetEmpty();
просто кажется странным.
Лучше ли в этом случае иметь поле только для чтения и регулярное свойство, или статический ctor и autoprop, кажется менее интересным, чем вопрос, делать ли это свойством вообще. В «пуристском» настроении я, скорее всего, примкну к Джону и сделаю это поле только для чтения. Но я также часто использую шаблон создания autoprops с частными установщиками для логически неизменных объектов, просто из-за лени.
Как это для того, чтобы принять все стороны вопроса?