1

我想弄清楚这是否可能。我的预感是它不是但想确认。

以下高阶函数使用空合并运算符:

    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()。

想法?

4

2 回答 2

3

它不会像这样工作,因为Coalesce()每次调用 getter 时都会调用(不是一个好名字,顺便说一句)。您可以将委托保存到一个字段并使用它。但如果你这样做,最好Lazy<T>从框架中使用:

private Lazy<string> m_someMember = new Lazy<string>(GetSomeMember);

protected string SomeMember
{
    get { return m_someMember.Value; }
}
于 2012-03-23T02:04:02.237 回答
0

看起来不可能,因为无论您尝试进入 getter 的任何闭包都将无法通过该调用(因为您不想在对象上存储任何内容)。

于 2012-03-23T02:30:42.223 回答