这取决于。
我已经看到了这个问题问了几次,这里是一个很好的例子,来说明“这取决于”的答案。
考虑下面的类:
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