我有一个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方法作为我没有想到的一点?
答案 0 :(得分:1)
这是一个调试器工件。当您使用手表或快速检查查看属性时,调试器将运行属性getter,以便它可以显示其值。这导致您的惰性初始化代码执行。所以你永远不会看到属性返回null。
要记住一些事情。
答案 1 :(得分:0)
假设在访问昂贵的属性时没有用户等待不必要的长时间,并且假设在每次运行中都没有访问昂贵的属性,这可以正常工作。
如果未给出其中任何一个条件,您可能需要考虑在后台初始化“昂贵”属性。
如果前台任务(例如UI)在后台任务有机会初始化之前访问属性,则属性访问将阻塞,直到属性初始化为止。
改进是告知后台初始化任务现在需要特定属性,以便下次初始化它。或者,前台任务将对此昂贵属性的初始化进行前景和后台任务之间的协调。