基本上,您应该尝试引用您需要的最广泛的类型。例如,如果某个变量被声明为List<...>
,您可以为可以分配给它的值的类型设置一个约束。您可能只需要顺序访问,因此将变量声明为就足够了IEnumerable<...>
。这将允许您将其他类型的值以及 LINQ 操作的结果分配给变量。
如果您发现您的变量需要通过索引访问,您可以再次将其声明为IList<...>
而不仅仅是List<...>
,允许将其他类型的实现IList<...>
分配给它。
对于函数返回类型,这取决于您。如果您认为该函数准确返回很重要,则将其List<...>
声明为准确返回List<...>
。如果唯一重要的是通过索引访问结果,也许您不需要约束自己返回完全List<...>
,您可以将返回类型声明为IList<...>
(但实际上返回List<...>
此实现中的一个实例,并且可能是其他支持的类型IList<...>
之后)。同样,如果您看到函数的返回值唯一重要的是它可以被枚举(并且不需要通过索引访问),您应该将函数返回类型更改为IEnumerable<...>
,给自己更多的自由。
现在,关于AsQueriable
,再次取决于您的逻辑。如果您认为可能的延迟评估在您的情况下是一件好事,因为它可能有助于避免不必要的计算,或者您打算将其用作另一个查询的一部分,您可以使用它。如果您认为结果必须“物化”,即此时计算,您最好返回 a List<...>
。如果稍后的计算可能导致不同的列表,您尤其需要具体化您的结果!
对于数据库,一个好的经验法则是AsQueriable
用于短期的中间结果,但List
用于将在较长时间内使用的“最终”结果。当然,有一个非物化查询会导致关闭数据库是不可能的(因为在实际评估数据库的时候应该仍然是打开的)。