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

MySQL

describe tablename
10
задан Simon 8 October 2009 в 09:35
поделиться

6 ответов

No, but this idea is being tracked on Connect.

7
ответ дан 3 December 2019 в 17:20
поделиться

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...

5
ответ дан 3 December 2019 в 17:20
поделиться

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

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

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

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

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

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

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

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

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

10
ответ дан 3 December 2019 в 17:20
поделиться

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?

1
ответ дан 3 December 2019 в 17:20
поделиться

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.

1
ответ дан 3 December 2019 в 17:20
поделиться

That's really convoluted mate.

Just make it a public readonly field.

-1
ответ дан 3 December 2019 в 17:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: