[英]Return an IEnumerable<T> or List<T> from library
我正在设计一个连接到数据源(类似于DB)并返回各种POCO对象的库。
我正在使用数据源供应商.NET库进行连接(并检索对象),然后将其转换为轻得多的POCO对象。 为了构建这些POCO对象,我对每个POCO类( .FromDBObject(DBObject obj)
都有一个静态方法,该方法接受DB对象并返回一个新的POCO实例。
到数据库的初始连接不是很快,所以不是我想即时执行的操作(每个POCO构建),因此我在其周围包装了一个库,用于管理连接以限制此速度并进行处理正确连接。
作为该库的一部分,我有许多方法可以返回POCO的列表。 数据库对象的一个“怪癖”是,当供应商库加载它们时,它们没有被加载到内存中,它们需要一个开放的连接来加载数据。
结果,如果我返回IEnumerable<POCO>
则有可能在枚举连接之前关闭连接(时间/处置),从而在创建POCO时崩溃。
因此,为简短的问题准备了很长时间。
IEnumerable<POCO>
但是在实际方法中执行.ToList()
来强制实例化,还是应该将返回类型指定为List<POCO>
? 您的方法返回类型应该与数据访问无关。 确定要先返回IEnumerable
还是List
。 如果IEnumerable
足够,则使用ToList()
。
如果您需要List
提供的额外方法,则返回List
会很好,因为它会执行隐式的ToList()
调用,尽管无论如何我都会明确地调用ToList()
只是为了清楚地表明您想要从该数据库中加载数据点在代码中。
如前所述,您必须已经对查询进行了迫切的评估。 渴望评估有两种选择。1. ToList()2. ToArray()
返回IList的利弊
如果使用者经常需要IList格式的数据,那么您将节省一个额外的枚举(因为返回的是query.ToList()而不是query.ToArray()..如果订户需要列表,则他们需要有效地调用query.ToArray ().ToList(),导致两次枚举)。 缺点是将返回类型从ILIST更改为IEnumerable会很麻烦。
就个人而言,我会选择IEnumerable,因为它所做的假设更少。 我假设如果您确实需要IList方法,则可以添加一个特殊的ListFromDBObject(DBOject obj)方法
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.