当某些方法/构造函数接受一个收集参数时,大部分时间参数类型是否应该用作IEnumerable
?如果是这样,该方法是否应该创建一个新列表(.ToList()
)以将引用存储在私有变量或方法范围局部变量中,而不是将该变量存储在IEnumerable
类型变量中?方法/构造函数中的集合参数?
请让我知道。
当某些方法/构造函数接受一个收集参数时,大部分时间参数类型是否应该用作IEnumerable
?如果是这样,该方法是否应该创建一个新列表(.ToList()
)以将引用存储在私有变量或方法范围局部变量中,而不是将该变量存储在IEnumerable
类型变量中?方法/构造函数中的集合参数?
请让我知道。
参数类型应该在大多数情况下用作IEnumerable吗?
如果你真的是IEnumerable<T>
然后是。除非类型需要更丰富的内容,否则您可以使用其中一个扩展IEnumerable<T>
的接口。
您应该避免使用非泛型接口和集合(名称空间System.Collections
)替换通用接口(命名空间System.Collections.Generic
)。
如果这样,应该在方法创建一个新的列表(.ToList())来存储在一个专用变量或在方法中的参照范围的局部变量,而不是存储在IEnumerable的类型变量的变量?
可能是的。
答案取决于你的类型的语义。如果定义为持有对该集合的引用,则不要复制它(例如,Organisation
中的多个ContactPerson
都可以与该组织共享该列表Interaction
)。在其他情况下,新对象将拥有该集合,然后它应该复制。
我想说你应该用某种方式来使用它,这会让你确信你只会迭代一次该集合。
所以,如果你只是使用简单foreach
IEnumerable
是好的,但如果你想做出更复杂的事情,你应该(用ToList()
,ToArray()
或类似),比使用本地变量,而不是迭代的本地存储它一遍又一遍地重复收集源代码。
如果你打算只使用读 - 使用IEnumerable
,如果要更新集合,由Add
,Remove
元素,你应该转换为集合类型,它允许你做这些动作的
你问题太模糊了。这取决于很多背景。有时你会想复制收藏 - 有时你不会。有时'IEnumerable'就够了 - 有时候不是。 –
有时你想保留对参数本身的引用,有时你可能更喜欢将它复制到ReadOnlyCollection或将其转换为IReadOnlyList ... –