Pre*_*n S 0 .net c# lazy-loading
正如标题所述,我想知道调用延迟加载的对象属性的最有效方法.考虑以下类定义:
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想用最昂贵的操作预加载StringList,那会是什么?
MyObject obj = new MyObject();
obj.StringList.ToString(); //?
obj.StringList.Count(); //?
obj.StringList.Equals(null); //?
Run Code Online (Sandbox Code Playgroud)
关于什么:
if(obj.StringList == null){}
Run Code Online (Sandbox Code Playgroud)
我不喜欢这种方法但看起来它比在属性上调用方法要便宜.
我正在寻找一个特定于List的答案以及一个通用的答案object
.
编辑:我知道这被认为是微优化,但这不是问题的关键.我不是在问你是否喜欢我在这里做的事情.我想知道相对于CPU和/或内存使用情况这样做的最佳方法,以及一些证据表明建议的方法实际上比其他方法更好.
我相信与null的比较是较便宜的方式.但是我不关心这样的微优化(如果你从文件或数据库加载数据,那么所有这些选项都没有比IO操作更好).此外,如果您想预加载数据,那么您不需要延迟加载.延迟加载的要点是推迟数据加载,直到你真的需要这些数据.
更新:如果您真的想要为属性预加载数据,我建议您以更明确的方式进行.否则,其他开发人员会猜测为什么要将属性与null进行比较或将它们设置为未使用的局部变量.在你的课堂上创建一些方法,清楚地表明你的意图:
MyObject obj = new MyObject();
obj.Load(); // or Initialize()
Run Code Online (Sandbox Code Playgroud)
我也认为这种优化是不相关的,但我猜"最好的"是
var someVar = obj.StringList;
Run Code Online (Sandbox Code Playgroud)
只需调用getter.您可能会收到警告,因为您有一个未使用的变量,但您可以使用pragma来抑制此警告...
但正如谢尔盖已经提到的那样,在这种情况下实现延迟加载是没有意义的......