Хотя это не общий метод для того, что вы хотите сделать (и его нет, и, как показывают другие ответы, вам нужно доверять другим разработчикам), в этом случае вы можете создать Lazy<List<T>>
( при условии .NET 4 или более поздней версии - хотя это легко сделать бэкпорт)
class Demo {
readonly Lazy<List<string>> _items;
public Demo() {
var _items = new Lazy<List<string>>( ExpensiveOperation);
}
List<string> Items { get { return _items.Value; }}
}
Подход readonly
/ не изменяемый - это, как правило, путь для поддержки полей в любом случае.
РЕДАКТИРОВАТЬ: Основываясь на ответе @ Timwi (идите +1, если вам нравится идея), вы можете отправиться в город, и в стиле JavaScript использовать ограничение на основе возможностей , чтобы даже не разоблачить * Поле 1010 *, над ним просто закрыта операция (также включает предложение ReadOnlyCollection
@Mr Disappointment):
class Demo {
readonly Func<ReadOnlyCollection<string>> _getItems;
public Demo() {
var items = new Lazy<List<string>>( ExpensiveOperation);
_getItems = () => items.Value.AsReadOnly();
}
ReadOnlyCollection<string> Items { get { return _getItems(); }}
}
И так заканчивается наш дурацкий трюк с кодированием.