2013-07-04 29 views
1

当某些方法/构造函数接受一个收集参数时,大部分时间参数类型是否应该用作IEnumerable?如果是这样,该方法是否应该创建一个新列表(.ToList())以将引用存储在私有变量或方法范围局部变量中,而不是将该变量存储在IEnumerable类型变量中?方法/构造函数中的集合参数?

请让我知道。

+4

你问题太模糊了。这取决于很多背景。有时你会想复制收藏 - 有时你不会。有时'IEnumerable '就够了 - 有时候不是。 –

+0

有时你想保留对参数本身的引用,有时你可能更喜欢将它复制到ReadOnlyCollection或将其转换为IReadOnlyList ... –

回答

4

参数类型应该在大多数情况下用作IEnumerable吗?

如果你真的是IEnumerable<T>然后是。除非类型需要更丰富的内容,否则您可以使用其中一个扩展IEnumerable<T>的接口。

您应该避免使用非泛型接口和集合(名称空间System.Collections)替换通用接口(命名空间System.Collections.Generic)。

如果这样,应该在方法创建一个新的列表(.ToList())来存储在一个专用变量或在方法中的参照范围的局部变量,而不是存储在IEnumerable的类型变量的变量?

可能是的。

答案取决于你的类型的语义。如果定义为持有对该集合的引用,则不要复制它(例如,Organisation中的多个ContactPerson都可以与该组织共享该列表Interaction)。在其他情况下,新对象将拥有该集合,然后它应该复制。

0

我想说你应该用某种方式来使用它,这会让你确信你只会迭代一次该集合。

所以,如果你只是使用简单foreachIEnumerable是好的,但如果你想做出更复杂的事情,你应该(用ToList()ToArray()或类似),比使用本地变量,而不是迭代的本地存储它一遍又一遍地重复收集源代码。

0

如果你打算只使用读 - 使用IEnumerable,如果要更新集合,由AddRemove元素,你应该转换为集合类型,它允许你做这些动作的