私はこれが可能かどうか頭を包み込もうとしています。私の勘は、確認したかったのではないということです。
次の高階関数は、null合体演算子を使用します。
public static Func<T> Coalesce<T>(this Func<T> source)
where T : class
{
T local = default(T);
return delegate
{
return local ?? (local = source());
};
}
目標は、次のようにプロパティ内で使用することです。
protected string SomeMember
{
get { return Coalesce(() => GetSomeMember())(); }
}
意図したとおりに機能した場合、GetSomeMember()関数は、プロパティが最初に呼び出されたときに1回だけ呼び出されます。その後、プロパティの保存されたインスタンスを返すことができます。(その基本的なメモ化/ null合体の概念)。
ここで注意が必要なのは、プライベートフィールドの使用を選択する代わりに、格納されたインスタンスをクロージャー内にトラップしようとすることです。'SomeMember'の状態をSomeMemberを含むクラス内に保存できることは知っていますが、好奇心のためにそれを明示的に回避しようとしています。目標は、get {}ブロック内にとどまるために必要なすべてのものです(これには、Coalesce()から返されたデリゲートを格納しないことも含まれます)。
プロパティにアクセスするたびに、返される内部関数と外部関数の両方が呼び出されるため、問題が発生します。'T local'変数は毎回再割り当てされるため、null合体演算子は常にGetSomeMember()を再呼び出しします。
考え?