Есть ли способ сделать автоматические свойства readonly (а не только private)?

автоматические свойства позвольте мне заменить этот код:

private MyType myProperty;
public MyType MyProperty
{
    get { return myPropertyField; }
}

этот код:

public MyType MyProperty { get; private set; }

С некоторыми изменениями здесь и там - но есть ли способ, чтобы заменить этот код:

private readonly MyType myProperty;
public MyType MyProperty
{
    get { return myPropertyField; }
}

С чем-то подобным?

6 ответов



действительно, в настоящее время нет способа сделать это.

мы понимаем, что в C# 3 мы создали немного философского оксюморона. Дизайн LINQ сильно пропитан традиционным неизменяемым функциональным стилем программирования - выполнение откладывается, запросы представлены неизменяемыми монадами, деревья выражений неизменяемы и так далее.

и все же в то же время инициализаторы объектов, инициализаторы коллекции и авто реквизит поощряют традиционный mutable-компонентный стиль программирования. Похоже, мы движемся в обоих направлениях - что свидетельствует о природе C#; это прагматический язык программирования, который поддерживает множество различных стилей программирования.

однако, так как мы все большие поклонники неизменного стиля программирования, и так как мы считаем, что этот стиль будет платить дивиденды в том, чтобы сделать его легче обеспечить правильность массово многопоточных приложений в будущем вездесущих многоядерных архитектуры, мы определенно заинтересованы в том, чтобы выяснить какой-то способ приручить изменчивость, которую мы ввели. Только для чтения автосвойств один очевидный способ сделать это; маленький шаг, но хороший.

все сказанное, мы еще даже не отправили C# 4 и не объявили, что после этого будут какие-либо новые языковые функции. Вы должны относиться ко всем моим размышлениям о гипотетических особенностях необъявленных продуктов как к спекуляциям "только для развлекательных целей", а не как к обещаниям или объявления.


нет, к сожалению, нет. Мне бы очень понравилась функция, которая может выглядеть так:

public readonly string Name { get; }

или (немного странным образом)

public readonly string Name { get; readonly set; }

Это будет преобразовано во что-то вроде:

private readonly string <>_Name;

public string Name { get { return <>_Name; } }

поворот заключается в том, что вызовы сеттера будут разрешены - но только внутри конструктора. Такие вызовы будут преобразованы непосредственно в назначения для резервного поля.

Я бы очень, очень хотел такую функцию. Может для C# 5...


readonly может применяться только к полям, поэтому я считаю, что нет.

не могли бы вы просто использовать:

public readonly MyType MyProperty;

как это тогда только назначается из конструктора в любом случае?


нет, вы не можете этого сделать. На самом деле, я не понимаю, почему вы хотите get значение свойства, которое не было set ранее. По понятным причинам вы не можете set значение, если нет ни set accessor, ни резервное поле.


Это действительно запутанный мат.

просто сделайте это общедоступным полем только для чтения.