返回值数组时的最佳实践(.NET)

时间:2009-02-20 15:50:15

标签: .net arrays generics

通常我的方法如下:

public List<int> Method1(int input)
{
    var output = new List<int>();
    //add some items to output
    return output;
}

但是FxCop建议另一个IList实现而不是List,但我不记得哪个。替代方案包括将其作为IList,ICollection或IEnumerable返回以获得更大的灵活性或与下面的代码完全不同的方式。:

public int[] Method2(int input)
{
    var output = new List<int>();
    //add some items to output
    return output.ToArray();
}

在所有备选方案中,所有提供的和所有可能性都被认为是最佳实践?

8 个答案:

答案 0 :(得分:6)

IEnumerable / IEnumerable&lt; T&gt;除非您特别需要列表,否则您应该返回IList&lt; T&gt;

答案 1 :(得分:5)

§8.3.1中的“框架设计指南”(第2版)对于作为返回值的集合有很多说法,摘要:

  • 不要提供可设置的集合属性。
  • DO 使用Collection<T>Collection<T>的子类作为属性或返回表示读/写集合的值。
  • DO 使用ReadOnlyCollection<T>ReadOnlyCollection<T>的子类,或者在极少数情况下IEnumerable<T>用于表示只读集合的​​属性或返回值。

(以及更多,但这三个捕获核心)。

上面的第一个:不要返回对内部集合的引用,除非您希望用户能够更改它(然后您可能应该有自定义类型以便您有一定程度的控制权。)

我会返回IList<T>并确保我没有定义我返回的实际类型,除非我返回一个迭代器(当我使用IEnumerable<T>时)。

答案 2 :(得分:5)

Eric Lippert关于returning an array is usually a bad idea的原因发表了很好的帖子。

通常情况下,你应该尽可能地保持一般性,而不会给那些打电话给你方法的人带来过度的悲伤。更喜欢具体类的接口,并选择最常用的接口。

返回接口可以更好地封装您的实现,并且将来更容易更改。如果您从具体类型开始,则承诺始终返回该类型。

IEnumerable<T>是最佳起点。随着LINQ的出现,调用者只有在枚举的情况下才能轻松完成。如果来电者偶尔需要一个列表,则可以轻松拨打.ToList()

如果调用者可能特别需要索引返回的集合,或者他们可能想要自己修改集合(插入/删除/重新排序项目),请考虑使用IList<T>

答案 3 :(得分:3)

ReadOnlyCollection<T>是另一种选择。

答案 4 :(得分:2)

在调用此方法的代码中返回所需的接口。

如果您需要对结果执行列表操作,请返回IList<T>。 如果您只需要枚举结果,请返回IEnumerable<T>

实际上,那些是我最常用的。 除非有充分的理由,否则我永远不会从公共接口返回数组。

答案 5 :(得分:1)

取决于。

您是否希望调用者能够修改项目并让您查看这些更改?可以修改数组。 IList接口定义了修改方法(但实现可能不允许)。

你能详细说明FxCop警告吗?

肯特

答案 6 :(得分:1)

这取决于您的要求。所有事情都说完了,在所有集合类型中,通过强类型数组的迭代是最快的。如果您不需要调整大小/添加/搜索它们,那么阵列就可以了。

答案 7 :(得分:1)

我几乎总是和List一起去,因为它给了我经常发现最有用的方法。

返回IEnumerable的一个潜在负面后果是,枚举时抛出的任何异常都来自可能与实际构建对象的代码相距甚远的代码区域,从而使错误跟踪更加困难