正如标题所述,我想知道调用延迟加载对象属性的最有效方法。请考虑以下类定义:
Class MyObject
{
private _stringList = null;
public List<string> StringList
{
set
{
_stringList = value;
}
get
{
if(_stringList == null)
{
_stringList = new List<string>();
//fill the List with strings from some data source
}
return _stringList;
}
}
}
现在我想用最昂贵的操作预加载StringList,那会是什么?
MyObject obj = new MyObject();
obj.StringList.ToString(); //?
obj.StringList.Count(); //?
obj.StringList.Equals(null); //?
怎么样:
if(obj.StringList == null){}
我不喜欢这种方法,但似乎比在属性上调用方法要便宜。
我正在寻找特定于List的答案以及通用的object
。
答案 0 :(得分:5)
我认为与null的比较是较便宜的方式。但是我不关心这种微优化(如果你从文件或数据库加载数据,那么所有这些选项都与IO操作相比没什么)。此外,如果您想预加载数据,那么您不需要延迟加载。延迟加载的要点是推迟数据加载,直到确实需要该数据为止。
更新:如果您真的想要为属性预加载数据,我建议您以更明确的方式进行。否则,其他开发人员会猜测为什么要将属性与null进行比较或将它们设置为未使用的局部变量。在课堂上创建一些方法,清楚地表明你的意图:
MyObject obj = new MyObject();
obj.Load(); // or Initialize()
答案 1 :(得分:5)
我也认为这种优化是不相关的,但我认为“最佳”将是
var someVar = obj.StringList;
只需调用getter。您可能会收到警告,因为您有一个未使用的变量,但您可以使用pragma来抑制此警告...
但正如谢尔盖已经提到的那样,在这种情况下,实施延迟加载是没有意义的......
答案 2 :(得分:0)
这是延迟加载的典型示例。另请注意,使用setter会破坏您示例的目的,因为如果每个客户端都可以重置您的列表,那么每个客户端都必须负责加载 - 这不是很好
Class MyObject
{
private List<string> _stringList = null;
public List<string> StringList
{
get
{
if(_stringList == null)
{
_stringList = new List<string>();
//fill the List with strings from some data source
}
return _stringList;
}
}
}
另一方面,如果您使用List.Count > 0
,则优化为Linq List.Any