Есть ли способ сделать автоматические свойства 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, ни резервное поле.