我如何懒惰加载属性?

时间:2012-06-28 17:24:52

标签: .net c#-4.0 lazy-loading

我有一个POCO类,主要是通过服务构建的。我用一些信息点击服务,返回一个dto并使用它来构建对象的一部分。我正在尝试做的是懒惰加载一些更大的属性,以便它们只按需填充。我认为这是做到这一点的方法:

        private List<User> _directReports;
        public List<User>DirectReports
        {
            get
            {
                if (this._directReports == null)
                {
                    SetDirectReports();
                }
                return this._directReports;
            }
            private set
            {
                this._directReports = value;
            }
        }

        private void SetDirectReports()
        {
            using (var client = new ADSClient())
            {
                this._directReports = client.GetDirectReports(this.Guid);
            }
        }

这是问题所在,也许我正在追逐幽灵,但是当我通过调试器并在实例化后查看对象的内容时,这些字段中包含了信息,并且它不应该在那个阶段完全打败了我想要做的目的。所以我试图理解这一点,我做错了吗?编译器是否运行get方法作为我没有想到的一点?

2 个答案:

答案 0 :(得分:1)

这是一个调试器工件。当您使用手表或快速检查查看属性时,调试器将运行属性getter,以便它可以显示其值。这导致您的惰性初始化代码执行。所以你永远不会看到属性返回null。

要记住一些事情。

答案 1 :(得分:0)

假设在访问昂贵的属性时没有用户等待不必要的长时间,并且假设在每次运行中都没有访问昂贵的属性,这可以正常工作。

如果未给出其中任何一个条件,您可能需要考虑在后台初始化“昂贵”属性。

如果前台任务(例如UI)在后台任务有机会初始化之前访问属性,则属性访问将阻塞,直到属性初始化为止。

改进是告知后台初始化任务现在需要特定属性,以便下次初始化它。或者,前台任务将对此昂贵属性的初始化进行前景和后台任务之间的协调。