加载属性延迟加载

时间:2017-02-24 13:28:04

标签: c# vb.net design-patterns lazy-evaluation

我有一个属性,getter应该只在第一次加载它的值。第二次它返回加载的值而不再加载它:

f.write(df_json.to_json(orient='records'))

在VB.NET中有private Object _MemberValue; public Object MemberValue { get { if(_MemberValue == null) { _MemberValue = LoadMember(); } return _MemberValue; } } 个关键字。有了它,你不必申报一个班级成员。

Static

在C#中没有这样的关键字。

此问题或其他模式是否有更好的C#实现?

2 个答案:

答案 0 :(得分:8)

  

此问题或其他模式是否有更好的C#实现?

可能不是。如果您愿意,可以使用Lazy<T>作为替代,但基本上它与您的第一个示例相同。在VB.NET has some serious drawbacks中使用Static,所以我不会以任何方式使用它。

如果您更喜欢Lazy<T>,我会使用这个:

private Lazy<object> _MemberLazy = new Lazy<object>(LoadMember);

public object MemberValue
{
    get
    {
        return _MemberLazy.Value;
    }
}

答案 1 :(得分:4)

您最初的做法似乎合适,我从来没有理由做出不同的事情。这就是说如果你的目标是避免可能被写入getter之外的类级字段,那么像this这样的东西就可以了。还有许多其他的ReadOnly,WriteOnce,SetOnce实现也可以起到类似的作用。

<强> ReadOnlyField.cs

public class YourObject
{
    private readonly ReadOnlyField<object> _someMember;

    public object MemberValue
    {
        get
        {
            if(_someMember.Value == null)
            {
                _someMember.Value = LoadMember();
                _someMember.Freeze();
            }

            return _someMember.Value;
        }
    }

    public YourObject()
    {
        _someMember = new ReadOnlyField<object>();
    }
}

<强> YourObject.cs

$('#calendar').fullCalendar('option', 'firstDay', moment().weekday());

这不完美。与您的VB.Net示例不同; getter之外的代码可以先写入字段,但至少在被调用Freeze之后你就会被覆盖。