从库</t> </t>返回IEnumerable <t>或List <t>

时间:2010-09-23 02:13:57

标签: c#

我正在设计一个连接数据源(类似于数据库)的库,并返回各种POCO对象。

我正在使用数据源供应商.NET库来建立连接(并检索对象),然后我将其转换为更轻的POCO对象。为了构建这些POCO对象,我在每个POCO类(.FromDBObject(DBObject obj)上都有一个静态方法,它接受数据库对象并返回一个新的POCO实例。

与DB的初始连接速度并不快,所以它不是我想要动态做的事情(每个POCO构建),所以我在它周围包装一个管理连接的库来限制这种减速,以及正确处理连接。

作为这个库的一部分,我有许多方法可以返回我的POCO列表。数据库对象的一个​​“奇怪之处”是,当供应商库加载它们时,它们不会加载到内存中,它们需要一个开放连接来加载它们的数据。

因此,如果我返回IEnumerable<POCO>,那么在枚举之前可能会关闭连接(时间/处置),从而在创建POCO时崩溃。

这是一个很短的问题。

  1. 我应该返回IEnumerable<POCO>但是在实际方法中执行.ToList()强制实例化,还是应该将返回类型指定为List<POCO>

2 个答案:

答案 0 :(得分:1)

您的方法返回类型应该对您的数据访问几乎没有影响。确定您是要先返回IEnumerable还是List。如果IEnumerable已足够,请使用ToList()

如果您需要List提供的额外方法,那么返回List就可以了,因为它会执行隐式ToList()调用,尽管我会明确地调用ToList()清楚地表明您希望在代码中的那一点加载数据库中的数据。

答案 1 :(得分:0)

正如您所提到的,您必须已强制对查询进行热切评估。您有两种急切评估选择 1. ToList() 2. ToArray()

返回IList的利弊

如果消费者经常需要IList格式的数据,那么您正在保存额外的枚举(因为您返回query.ToList()而不是query.ToArray()..如果订阅者需要列表,他们需要有效地调用query.ToArray()。ToList(),导致双枚举)。结果是将返回类型从ILIST更改为IEnumerable将会破坏。

就个人而言,我会选择IEnumerable,因为它的假设更少。我假设如果你真的需要一个IList方法,你可以添加一个特殊的ListFromDBObject(DBOject obj)方法