【发布时间】:2014-01-14 06:54:23
【问题描述】:
我有一个公共属性 (AllCustomers),它由一个私有属性支持,用于延迟加载。
我了解公共属性应该是 IEnumerable ("program to interfaces, not implementations")。
但是,我可以看到两种构建私有财产的方法。
第一个选项,带有私有列表-
private List<Customer> _AllCustomers;
public IEnumerable<Customer> AllCustomers
{
get
{
if (_AllCustomers == null)
{
_AllCustomers = DAL.GetAllCustomers().ToList();
}
return _AllCustomers;
}
}
第二个选项,带有私有 IEnumerable-
private IEnumerable<Customer> _AllCustomers;
public IEnumerable<Customer> AllCustomers
{
get
{
if (_AllCustomers == null)
{
_AllCustomers = DAL.GetAllCustomers();
}
return _AllCustomers;
}
}
我认为第一个选项看起来更正确,因为它会访问数据库一次并存储结果,而第二个会导致多次数据库访问。
我的问题是-
- 我的分析是否正确?
- 不同方法的含义是什么?
- 是否有任何时候首选第二个选项?
- 有没有更好、更惯用的方式来表达 第二个选项?
【问题讨论】:
-
如果不知道
DAL.GetAllCustomers()做了什么,我们不可能回答。例如,它可能会返回List<Customer>,即使它声明返回IEnumerable<Customer>。 -
为什么你的私有成员是属性,而不是字段?
-
@MarcinJuraszek - 谢谢,私人成员已更新到字段。
-
@JonSkeet - 所以如果 DAL.GetAllCustomers() 返回一个 List
,那么样本之间就没有区别了吗? -
@Spongeboy:不一定。第一个版本创建列表的副本。例如,
DAL.GetAllCustomers()可能正在缓存它返回的列表 - 在这种情况下,您可以通过将AllCustomers的结果转换回List<Customer>并对其进行修改来轻松展示不同的行为。
标签: c# asp.net list ienumerable private-members