代码之家  ›  专栏  ›  技术社区  ›  Alastair Pitts

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

c#
  •  1
  • Alastair Pitts  · 技术社区  · 14 年前

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

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

    到数据库的初始连接不是很快,所以它不是我想在运行中(每个poco构建)要做的事情,所以我在它周围包装了一个库,用于管理连接以限制这种减速,并正确地处理连接。

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

    因此,如果我返回 IEnumerable<POCO> 然后有可能在枚举之前关闭连接(时间/释放),从而在创建POCO时崩溃。

    所以一个很长的问题。

    1. 我应该回来吗? IEnumerable<poco> 但在实际方法中 .ToList() 强制实例化,或者应该将返回类型指定为 List<POCO> ?
    2 回复  |  直到 14 年前
        1
  •  1
  •   Daniel T.    14 年前

    IEnumerable List ToList()

    无论如何,只是为了清楚地表明您希望在代码中从数据库加载数据。

        2
  •  0
  •   cordialgerm    14 年前

    正如您提到的,您必须已经强制对查询进行一个热切的评估。你有两种选择来进行热切的评估 1。托尔斯特() 2。托拉()

    返回IList的利弊

    如果使用者经常需要IList格式的数据,那么您将保存一个额外的枚举(因为您返回的是query.tolist()而不是query.toarray()。如果订阅服务器需要列表,则需要有效地调用query.toarray().to list(),从而导致双重枚举)。缺点是,将返回类型从ilist更改为ienumerable将会中断。

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