0

我有一个主要通过服务构建的 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 方法作为我没有考虑的某个点运行?

4

2 回答 2

1

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

要记住的事情。

于 2012-06-28T17:35:17.410 回答
0

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

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

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

一种改进是通知后台初始化任务现在需要特定属性,以便接下来可以对其进行初始化。或者,在前台任务和后台任务之间进行协调,前台任务将接管这个昂贵属性的初始化。

于 2012-06-28T17:30:03.743 回答