我正在设计一个具有多个函数的类,返回对象列表。我注意到,当IEnumerable<T>
转换为List<T>
时,调试变得更容易,因为可以在Watch窗口中查看对象。但是,对于IEnumerable
,我不确定这是否是最佳做法。
问:哪个更好?
public IEnumerable<MyData> GetData()
{
return Foo();
}
public IEnumerable<MyData> GetData()
{
return Foo().ToList();
}
答案 0 :(得分:5)
良好做法 - 除非有充分理由/要求,否则不要工作。因此,除非您有特殊原因 - 只需返回IEnumerable<MyData>
而不调用ToList()/ ToArray()就可以了。
潜在原因:
答案 1 :(得分:2)
更好地返回IEnumerable<..>
作为更通用的类型。 调用者之后可以决定如何处理它。在你的情况下,你会在两种情况下都返回IEnumerable<..>
,因此没有任何理由运行ToLIst()
,只需返回IEnumerable
答案 2 :(得分:1)
这实际上取决于您的要求。方法签名的返回类型也是该方法的合同的一部分。返回IEnumerable的方法指示值流,而返回List(或更抽象,Collection)的方法返回可变的值集合。
我通常会尝试跟上以下做法。
答案 3 :(得分:1)
我最好使用一个元素列表,以防你使用将要处理的工作单元,因为一旦它被处理掉,你将无法获得你的元素。
在所有其他情况下,可以返回通用 IEnumerable ,因为它提供了更好的灵活性。
最后,这一切都归结为您的要求,请注意,IEnumnerable不会在分配给变量的确切时刻检索元素,而是在枚举时检索。
答案 4 :(得分:1)
IEnumerable<T>
向来电者提供T集合的合同。但是,当您使用IList<T>
或List<T>
时,您建议他们可以直接添加或删除元素(不通过任何方法,例如你可能在你的类实现中添加或注册)。如果你的意图只是让调用者看到“项目”,IEnumerable就是更好的合同。
虽然它不是100%,但我将IEnumerable返回值视为只读集合。
易于调试应该是良好设计的次要因素。我建议您只是对您的类进行单元测试,而不是依赖于能够在运行时查看内部。但是,在大多数情况下,调试器将“基础”类显示为第一项。所以IEnumerable的第一项是您实际在内部使用的List。只需要一次“扩展”即可看到会员!
答案 5 :(得分:0)
返回IEnumerable允许调用者决定如何处理结果 - 枚举它或将其传递给其他东西而不在当前枚举它。 ToList()强制将此时枚举的数据放入一个列表中,然后将该列表传递给调用者。
因此 - IEnumerable很可能是两者中最好的 - 但是在调试时使用ToList会更容易。
答案 6 :(得分:0)
有一个简单的规则:返回更多concrette,接受更多泛型。
如果您的返回值确实为IEnumerable<>
,则按原样返回。但永远不要那样做:
public IEnumerable<MyData> GetData()
{
return this.list; // list = new List<MyData>();
}
以上代码无需任何限制来限制来电者。它将是一个列表,并且调用者无论如何都能够将其转换为列表并清除它。例如。