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