這取決於。
我已經看到了這個問題問了幾次,這裏是一個很好的例子,來說明「這取決於」的答案。
考慮下面的類:
public class MyClass
{
public static IEnumerable<int> Test()
{
return new List<int> { 2, 3, 4 };
}
public static List<int> Test2()
{
return new List<int> { 2, 3, 4 };
}
}
Test
返回IEnumerable
和Test2
返回一個具體實現IEnumerable
接口(List
在這種情況下)的。什麼是最好的方法? Test
或Test2
?
事實上,無論是在語義上是不同的:
- 作爲
Test
只返回一個IEnumerable
,它意味着,它的合同的方法,開發人員使用返回的對象枚舉的一部分(foreach
)。
- 由於
Test2
返回List
實例,它允許用戶通過索引訪問List
的對象。這與返回的對象完全不同。
private static void Main(string[] args)
{
foreach (var z in MyClass.Test())
{
Console.WriteLine(z);
}
var f = MyClass.Test2()[0];
Console.ReadKey();
}
如果你希望開發者使用返回的對象枚舉只,那麼你可以使用接口作爲返回類型。如果你希望開發者使用方法/具體實施的接口的屬性(在上面的例子中,訪問由索引對象),那麼你可以返回一個具體類型。
還記得,有時候你別無選擇。例如,如果要公開應當用於爲Silverlight結合公開徵集,那麼你就應該返回ObservableCollection<T>
,不IEnumerable<T>
,因爲結合系統實際需要ObservableCollection
類的方法/屬性/行爲(IEnumerable
會不會足以讓綁定工作)。
你應該避免的是一種方法,返回IEnumerable<T>
並且每次與ToList()
一起使用。
我討厭那些返回IEnumerable的方法,當我們得到的是一個List 。我不能使用常規for循環(參考項與其索引),或者甚至調用最簡單的Count方法(不使用LINQ Count方法)。當我所做的只是返回一個列表時,我使用的返回類型是IList 。與收益回報結合使用時,我只/大部分會返回IEnumerable 。一個註釋:在開發公共圖書館時,使用IEnumerable可能會有更多優勢。 –
Nullius
2015-11-02 13:23:46