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

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

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 ответов

Решение

Нет, но эта идея отслеживается в Connect.

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

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

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

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

Тем не менее, мы еще даже не выпустили 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;

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

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

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

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

Другие вопросы по тегам