2011-08-29 107 views
13

它是一個很好的做法,用IEnumerable應用範圍時,你並不需要真正添加刪除的東西,但只是列舉出來?的IEnumerable和良好做法(WCF)

側面問題:您是否曾經從WCF服務返回IEnumerable<T>有任何問題?這會給客戶端應用程序帶來問題嗎?畢竟,我認爲這將被序列化爲一個數組。

+1

也許你應該添加你正在談論的語言?這不是一個.net專用的網站,畢竟... –

+0

你是對的。謝謝。 – User

+2

雖然這是**不是一個完全重複**,我仍然建議你看看這個問題: http://stackoverflow.com/questions/1072614/should-i-always-return-ienumerablet-instead-of -ilistt – yas4891

回答

1

我沒有任何Good Practices源代碼,但我經常傾向於依賴List來收集我的集合,它實現IEnumerable,但我將它作爲List傳遞,而不是IEnumerable,如果我需要它被讀取只有我寧願通過ReadOnlyCollection ..

1

我不喜歡返回或接受IList<T>List<T>,因爲它們暗示修改集合的能力。

所以更願意將T[]作爲固定大小的集合返回。此外,陣列可以輕鬆映射到任何其他框架,平臺等。

並傾向於接受IEnumerable<T>以強調方法將枚舉該集合。

+3

T []不是隻讀集合:您可以修改數組的元素。相反,IList 並不意味着修改集合的能力 - 例如, IList .IsReadOnly適用於ReadOnlyCollection 。如果調用者不修改返回的集合很重要,最好返回IList 並將其作爲ReadOnlyCollection 實現不可變對象。 – Joe

+0

@Joe:你說得對。不是隻讀的。只是固定大小。 – abatishchev

12

我傾向於只返回IEnumerable<T>,當我想暗示調用者實現可能會使用懶惰評估。否則,如果結果是隻讀的,我通常會返回IList<T>ICollection<T>,並將其作爲ReadOnlyCollection<T>執行。

懶惰評估可能是一個重要的考慮因素:如果您的實現可以拋出異常,則在調用者開始枚舉結果之前不會拋出該異常。通過返回IList<T>ICollection<T>,您可以保證在調用方法時拋出任何異常。

對於WCF方法,從使用延遲評估的方法返回IEnumerable<T>意味着任何異常可能不會被拋出,直到您的響應被序列化爲止 - 這樣您就不太可能在服務器端處理它。