2013-07-04 57 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元素,你應該轉換爲集合類型,它允許你做這些動作的