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

x759pob2  于 2023-05-19  发布在  .NET
关注(0)|答案(9)|浏览(158)

通常我的方法如下:

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();
}

在所有的选择、所有的提供和所有的可能性中,哪一种被认为是最佳实践?

jjjwad0x

jjjwad0x1#

IEnumerable / IEnumerable除非您特别需要列表,否则您应该返回IList

6ioyuze2

6ioyuze22#

“框架设计指南”(第2艾德)在§8.3.1中有很多关于集合作为返回值的内容,总结:

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

(and但这三个都是核心)。
上面的第一个:不要返回对内部集合的引用,除非你希望用户能够改变它(然后你可能应该有一个自定义类型,这样你就有一定程度的控制)。
我将返回IList<T>,并确保我没有定义我返回的实际类型,除非我返回一个迭代器(当我使用IEnumerable<T>时)。

mutmk8jj

mutmk8jj3#

Eric Lippert有一篇关于为什么returning an array is usually a bad idea的好文章。
通常,您应该尽可能地通用,而不会给将要调用您的方法的人带来不必要的麻烦。与具体的类相比,更喜欢接口,并选择最通用的接口。
返回接口可以更好地封装您的实现,并使将来更容易更改。如果你从一个具体的类型开始,你就被要求“总是”返回该类型。
IEnumerable<T>是最好的起点。随着LINQ的出现,只要给出一个枚举,调用者就可以轻松地完成很少的事情。如果调用者偶尔需要一个列表,调用.ToList()很容易。
如果调用者可能有特定的需求来索引返回的集合,或者如果他们可能想要自己修改集合(插入/删除/重新排序项),请考虑使用IList<T>

kmynzznz

kmynzznz4#

ReadOnlyCollection<T>是另一种选择。

ipakzgxi

ipakzgxi5#

返回调用此方法的代码中所需的接口。
如果需要对结果执行列表操作,则返回IList<T>。如果只需要枚举结果,则返回IEnumerable<T>
实际上,这些是我用得最多的。除非有很好的理由,否则我从不从公共接口返回数组。

3okqufwl

3okqufwl6#

看情况
是否希望调用方能够修改项目并让您看到这些更改?数组可以修改。IList接口定义了修改的方法(但是实现可能不允许这样做)。
你能详细说明一下FxCop的警告吗?
肯特

x8diyxa7

x8diyxa77#

这取决于你的要求。总之,强类型数组的迭代是所有集合类型中最快的。如果你不需要调整/添加/搜索它们,数组是很好的。

8wtpewkr

8wtpewkr8#

我几乎总是使用List,因为它给了我经常发现最有用的方法。
返回IEnumerable的一个潜在的负面后果是,枚举时抛出的任何异常都将来自一个可能与实际构建对象的代码相距甚远的代码区域,这使得bug跟踪更加困难。

tgabmvqs

tgabmvqs9#

一些指数或多项式算法中有许多值,您希望提取这些值,而不需要添加多个重复的方法,这些方法只返回这些单独的值。返回new int[] { log n,x^n,residue }。
您可以创建多个方法来facade;但你只需要一个算法来完成这项工作。最好不要递归。

相关问题