我想弄清楚这是否可能。我的预感是它不是但想确认。
以下高阶函数使用空合并运算符:
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() 函数只会在第一次调用该属性时调用一次。此后,可以返回存储的属性实例。(它的基本记忆/空合并概念)。
现在棘手的部分是尝试将存储的实例捕获在闭包中,而不是选择使用私有字段。我知道您可以将“SomeMember”的状态存储在包含 SomeMember 的类中,但出于好奇,我明确地试图避免这种情况。目标是所有需要保留在 get { } 块中的东西(包括不存储从 Coalesce() 返回的委托)。
由于每次访问属性时都会调用内部返回函数和外部函数,因此存在问题。'T local' 变量每次都被重新分配,因此 null 合并运算符总是重新调用 GetSomeMember()。
想法?