No, unfortunately not. I would very much like the feature, which could look like this:
public readonly string Name { get; }
or (slightly oddly)
public readonly string Name { get; readonly set; }
This would be converted into something like:
private readonly string <>_Name;
public string Name { get { return <>_Name; } }
The twist is that setter calls would be allowed - but only within the constructor. Such calls would be converted directly into assignments to the backing field.
I would dearly, dearly love such a feature. Maybe for C# 5...
На самом деле, в настоящее время нет способа сделать это.
Мы понимаем, что в C # 3 мы создали своего рода философский оксюморон. Дизайн LINQ в значительной степени основан на традиционном неизменяемом функциональном стиле программирования - выполнение откладывается, запросы представлены неизменяемыми монадами, деревья выражений неизменны и т. Д.
И все же в то же время инициализаторы объектов, инициализаторы коллекций и автоматические свойства поощряют традиционный стиль программирования на основе изменяемых компонентов. Похоже, мы идем в обоих направлениях, что свидетельствует о природе C #; это прагматичный язык программирования, поддерживающий множество различных стилей программирования.
Однако, поскольку все мы большие поклонники неизменного стиля программирования, и поскольку мы считаем, что этот стиль принесет дивиденды, упростив обеспечение корректности массово многопоточных приложений в будущих повсеместных многоядерных архитектурах, мы определенно заинтересованы в поиске способа приручить введенную нами изменчивость. Автозаполнение только для чтения - один из очевидных способов сделать это; небольшой шаг, но хороший.
Тем не менее, мы еще даже не выпустили C # 4 и не объявили, что после этого появятся какие-либо новые языковые функции. Вам следует относиться ко всем моим размышлениям о гипотетических характеристиках необъявленных продуктов как к предположениям «только для развлечения», а не как к обещаниям или объявлениям.
Мне определенно интересно найти способ обуздать введенную нами изменчивость. Автозаполнение только для чтения - один из очевидных способов сделать это; небольшой шаг, но хороший.Тем не менее, мы еще даже не выпустили C # 4 и не объявили, что после этого появятся какие-либо новые языковые функции. Вы должны относиться ко всем моим размышлениям о гипотетических характеристиках необъявленных продуктов как к предположениям «только для развлечения», а не как к обещаниям или объявлениям.
Мне определенно интересно найти способ обуздать введенную нами изменчивость. Автозаполнение только для чтения - один из очевидных способов сделать это; небольшой шаг, но хороший.Тем не менее, мы еще даже не выпустили C # 4 и не объявили, что после этого появятся какие-либо новые языковые функции. Вы должны относиться ко всем моим размышлениям о гипотетических характеристиках необъявленных продуктов как к предположениям «только для развлечения», а не как к обещаниям или объявлениям.
readonly
can only be applied to fields, so I believe not.
Could you not just use:
public readonly MyType MyProperty;
as it is then only assignable from the constructor anyway?
No, there's no way you can do it. In fact, I don't see why would you want to get a value of a property which has not been set previously. For obvious reasons, you cannot set the value if there's neither set
accessor, nor backing field.
That's really convoluted mate.
Just make it a public readonly field.