调用延迟加载的最有效方法

时间:2014-02-04 21:43:51

标签: c# .net 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;
        }
    }
}

现在我想用最昂贵的操作预加载StringList,那会是什么?

MyObject obj = new MyObject();
obj.StringList.ToString(); //?
obj.StringList.Count(); //?
obj.StringList.Equals(null); //?

怎么样:

if(obj.StringList == null){}

我不喜欢这种方法,但似乎比在属性上调用方法要便宜。

我正在寻找特定于List的答案以及通用的object

编辑:我知道这被认为是一种微观优化,但这不是问题的关键。我不是在问你是否喜欢我在这里做的事情。我想知道相对于CPU和/或内存使用情况这样做的最佳方法,并且证明建议的方法实际上比其他方法更好。

3 个答案:

答案 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