2011-02-24 142 views
15

可能重複:
C# - List<T> or IList<T>爲什麼要通過List <T>返回IList <T>?

這是寫在這樣你應該返回從你的方法IList<T>而不是List<T>,但我無法找到任何真正的好理由。我一直在尋找的代碼,這樣做,然後調用代碼通常做兩件事情之一:

  1. 呼叫new List<T>(returnedIList)所以它可以使用列表
  2. 所有好的方法蒙上回List<T>所以它可以使用所有名單上的不錯方法

第一個是笨重的,第二個會拋出時(runtime)InvalidCastException如果實現實際改變別的東西呢(這使得它完全小號 tupid)。

如果我使用List<T>出於某種原因,有與IList<T>的實現,我不能從List<T>繼承然後我會建立錯誤,必須改變一些代碼來取代它。這可能不太可能,如果發生這種情況,修復的工作並不多。當然,不值得失去List<T>的好處和/或不得不施放/新的List<T>(Exists,Find等)讓他們回到這種不太可能的情況?

那麼,還有沒有其他的原因在那裏返回IList<T>

+2

它不僅是「寫滿了所以」,這個問題已經被問及回答! – 2011-02-24 17:46:59

+0

道歉 - 在3頁的結果後,我放棄了尋找 - 所以最近,「相關性」對我來說似乎有點小了!去與這個答案:http://stackoverflow.com/questions/400135/c-listt-or-ilistt/1522826#1522826; D – 2011-02-24 18:09:27

+0

沒有道歉需要,SO搜索是有用的。我用Google在網站上搜索:stackoverflow.com!找到愚人節! – 2011-02-24 18:44:10

回答

1

的原因是讓你的方法可以與任何實現IList<T>,而不僅僅是一個列表中。但是,更糟的是,自從Linq問世以來,我已經開始做大量的東西,返回Enumerable<T>甚至只是IEnumerable

我不知道我理解的難度,雖然。如果某物正在返回實際列表,並且其返回取決於該列表,或者其使用是特定的,那麼它應該返回List<T>。如果沒有,那麼你就不需要將它轉換成列表。

+0

我懷疑調用代碼是在該方法之後編寫的,程序員不願意更改該方法以返回具體的List - 而我試圖瞭解該決定是否合理。 – 2011-02-24 18:06:43

1

真的應該返回的IEnumerable如果可能的話,否則IList的。

釷的原因是,你可能想用別的東西比在未來的List。實現自己的實現IList的列表並不罕見,然後您不需要更改大部分代碼。

搜索派生類型自IList和你看,你得到的只是在.NET框架內的許多命中!

+0

IEnumerable不適用於很多代碼的功能(我想改變它 - 一,我討厭一切都加載到內存時,我們可以「流」過的結果)。如果我們要實現一個自定義列表,我想我們會更容易從列表開始比滾動整個事情? – 2011-02-24 18:03:48

+0

IEnumerable實際上是一種很好的方式來返回可能最終被用作列表的東西,因爲新的列表可以直接從IEnumerable創建(就像你的第一個例子)。我不能肯定地說,但我懷疑做的開銷這與直接返回一個新的List對象相比,返回IEnumerable的東西應該用'yield'實現,因此實際上並沒有創建任何新的列表對象,因此實例化一個列表並添加元素的次數將會相同e ither的方式。 – 2011-02-24 18:14:58

+0

是的,我知道了IEnumerable 不會永遠符合該法案,但如果這樣做,你都可以被突然用之類的東西固定陣列和IQuerables,這有很大幫助,一旦你習慣了它。更高級的列表根本不需要擴展List,一個例子可能是延遲加載與List完全不同的存儲策略的列表 - 所以列表可能是基礎,但我通常不使用它(在這種情況下,我將它包裝它代替)。 – 2011-02-24 18:18:01

10

這聽起來像你在看一些質量差的代碼。

返回IList<T>而不是List<T>允許您的代碼更加靈活。您可以用實現IList<T>的任何集合替換實現,而不會破壞任何調用代碼。這是一件好事......但只有在IList<T>中定義的功能符合您的需求時纔是如此。

您能大概地說,你應該總是返回最普通類型的可能。在大多數情況下,您可以通過IEnumerable<T>逃脫,但是如果您需要更多功能,則可以使用IList<T>。如果這不能削減它,返回具體類型並完成它。

在你提到的兩種情況下,都需要使用非直接由IList<T>提供的東西(如果沒有,那麼這兩種方法都會出錯)。在這些情況下,該方法應返回List<T>以提供所需的功能,或者調用方應該使用其他方法。

+0

是啊!這正是每個人對最佳實踐所說的話。不過,可能是因爲我正在絕大多數時間使用更具抽象層次(如業務規則)特徵的代碼來工作,所以在過去的12年中,我沒有遇到過這樣的情況:改變實施。然而,當我處理實現列表的類時,我可以看到一些情況,並且希望在其他一些情況下繼承這個類,在這些情況下,通過List使用IList是有好處的。 – Samuel 2016-11-16 16:15:04

1

的想法是讓來電者決定他們將使用的收集。你會看到很多人只要有可能就返回IEnumerable<T>。這通常被認爲是很好的做法。返回IList讓調用者在返回List時要使用他們喜歡的任何IList實現,這要求他們手動將List中的數據複製到他們選擇的數據集合中。

返回IEnumerable是理想的。

+0

我不明白返回IList的是如何讓來電者在執行決定(我們正在談論回國,不接受作爲參數,如果這是你的意思) – 2011-02-24 18:05:37

+0

隨着越來越多的類實現,我會採取的IEnumerable的例子接口。當我調用一個返回IEnumerable的方法時,我可以決定只通過它來foreach()或者創建一個List/Queue/Stack/SortedList等。它允許我使用我喜歡的IEnumerable接口的實現。另一方面,返回列表迫使我使用列表或創建堆棧,例如手動輸入堆棧中列表中的每個項目。 – 2011-02-24 18:20:24

+0

如果我返回列表,你也可以創建任何這些(因爲List是IEnumerable)! – 2011-02-26 10:46:36

相關問題