Есть ли способ сделать только для чтения (не только частные) автоматические свойства? - PullRequest
10 голосов
/ 08 октября 2009

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

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 ]

10 голосов
/ 08 октября 2009

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

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

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

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

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

7 голосов
/ 08 октября 2009

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

5 голосов
/ 08 октября 2009

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

public readonly string Name { get; }

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

public readonly string Name { get; readonly set; }

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

private readonly string <>_Name;

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

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

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

1 голос
/ 08 октября 2009

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

1 голос
/ 08 октября 2009

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

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

public readonly MyType MyProperty;

как же его тогда можно назначить только из конструктора?

0 голосов
/ 08 октября 2009

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

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

...