我有一个属性,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#实现?
答案 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之后你就会被覆盖。