2010-08-25 68 views
2

有人告訴我,但我沒有看到這個地方,我已經用完了所有,我不明白爲什麼它會是不好的做法。使用泛型作爲函數的返回值是不好的做法嗎?

我的意思是具有諸如示例:

public List<SomeCustomeType> GetListOfStuff() 
{ 
} 

public void DoSomeStuff(List<SomeCustomeType> param) 
{ 

} 

誰能告訴我,爲什麼會這樣不好的做法應該被使用? 謝謝!

+0

我不確定我是否完全理解了這個問題。但可能他們可能指的是使用List <>而不是IList <> ...正如我所說的,不太確定是什麼意思 - 對不起:) – 2010-08-25 15:03:59

+0

沒有問題只是在返回類型或參數中使用T類型:像Bla 或IeNumerable 詞典等 謝謝 – codewrath 2010-08-25 15:24:12

回答

6

封閉和開放泛型類型可以在框架中使用,應該使用。如果您使用的是不正確的類型或者不需要公開的功能,那麼這可能是不好的做法 - 例如,最好返回IList<T>,然後List<T>,因爲那樣您就不會綁定到實現,並且可以使用實現的任何類型IList<T>

以類似的方式,您應該只使用公開所需minumun的類型 - 如果您只需要枚舉返回的列表,則最好返回IEnumerable<T>而不是IList<T>

+0

是的,這也是我的理解,我想看看是否有人在其他陣營。謝謝。 – codewrath 2010-08-25 15:22:08

0

不,這不壞。不過,使用通用接口IList<T>比通用類List<T>更好。

+0

爲什麼不只是返回一個IEnumerable或ICollection? – 2010-08-25 15:02:37

+0

返回ReadOnlyCollection 更好。 – 2010-08-25 15:02:54

+0

@ the_drow:因爲會員的消費者可能需要使用'List '或'IList '特定成員。出於同樣的原因,不要返回'object' – abatishchev 2010-08-25 15:04:19

0

第一個比較好。很顯然,該方法創建新列表並返回它, 不清楚是誰負責創建第二個版本列表,以及如果它不是空的將會發生什麼......

2

在LINQ及其相關擴展方法的時代,返回IEnumerable<T>被認爲是最佳實踐,即使底層集合實現了IList<T>。當底層集合是IList<T>時,LINQ擴展方法Count()ElementAt()都有優化,所以對性能的影響通常可以忽略不計。

這種做法將客戶端代碼與您如何管理集合的細節隔離開來(也許您將來希望使用不同類型的集合?)遵循此模式時要考慮的主要問題是清楚地記錄你是否正在進行某種形式的有狀態惰性評估,可能需要客戶自行緩存結果(例如使用ToArray())。

相關問題