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

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和/或内存使用情况这样做的最佳方法,以及一些证据表明建议的方法实际上比其他方法更好.

Ser*_*kiy 5

我相信与null的比较是较便宜的方式.但是我不关心这样的优化(如果你从文件或数据库加载数据,那么所有这些选项都没有比IO操作更好).此外,如果您想预加载数据,那么您不需要延迟加载.延迟加载的要点是推迟数据加载,直到你真的需要这些数据.

更新:如果您真的想要为属性预加载数据,我建议您以更明确的方式进行.否则,其他开发人员会猜测为什么要将属性与null进行比较或将它们设置为未使用的局部变量.在你的课堂上创建一些方法,清楚地表明你的意图:

MyObject obj = new MyObject();
obj.Load(); // or Initialize()
Run Code Online (Sandbox Code Playgroud)


Dir*_*ber 5

我也认为这种优化是不相关的,但我猜"最好的"是

var someVar = obj.StringList;
Run Code Online (Sandbox Code Playgroud)

只需调用getter.您可能会收到警告,因为您有一个未使用的变量,但您可以使用pragma来抑制此警告...

但正如谢尔盖已经提到的那样,在这种情况下实现延迟加载是没有意义的......

  • @PrestonS你问过最有效的方法,而不是最优雅的......无论如何,没有优雅的解决方案可以做到这一点,任何看着你的代码而不知道内部工作的人会认为这是一个错误并将其删除.如果你想优雅地添加一个名为PreLoad的方法... (5认同)