Одна идиома в C# для "создания значения при первом доступе"1 заключается в использовании чего-то вроде следующего2:
public string X {
get {
return _x ?? (_x = MakeX());
}
}
Учитывая небольшую вариацию, где MakeX
определяется как void MakeX(out string x)
вместо «стандартного» string MakeX()
, есть ли способ использовать сокращения синтаксиса C# [7]?
(Существует миллион способов переписать код3; вопрос прежде всего в том, существуют ли какие-либо новые приемы, позволяющие использовать в выражении оператор 'out'.)
Следующее не работает (может быть хуже, чем это1..), но вот суть:
public string X {
get {
return _x ?? { MakeX(out _x); _x };
}
}
Семантическая полная форма (которая допустима..) будет выглядеть примерно так:
public string X {
get {
var x = _x;
if (x != null) return x;
MakeX(out x);
return (_x = x);
}
}
1Предполагается, что потокобезопасность не важна, пока возвращается значение. Нет предложений для Lazy
:}
2Исходный стиль get
не вызывает сомнений.
3Вопрос касается, в частности, нового синтаксиса, а не использования "чрезмерно хитрых трюков" с лямбда-выражениями. Таким образом, return _x ?? (() => {MakeX(out _x); return _x;})();
по-прежнему будет означать «нет» на вопрос.