参数/返回值(集合)的代码约定是什么

时间:2008-10-07 08:41:18

标签: c#

我和一位朋友就一个方法的返回值/输入值中的集合用法进行了一些讨论。他告诉我,我们必须使用 - 返回值的派生类型最多。 - 输入参数的派生类型最少。

因此,这意味着,例如,方法必须将ReadOnlyCollection作为参数,并返回List。

此外,他说我们不能在公共API中使用List或Dictionary,而我们必须使用,而不是Collection,ReadOnlyCollection,......所以,在方法是公共的情况下,它的参数和它的返回值必须是Collection,ReadOnlyCollection,......

是不是?

3 个答案:

答案 0 :(得分:8)

关于输入参数,使用最不具体的类型通常更灵活。例如,如果您要执行的所有方法都是枚举作为参数传递的集合中的项目,则接受IEnumerable< T>会更灵活。

例如,考虑一个接受参数的方法“ProcessCustomers”:

public void ProcessCustomers(IEnumerable<Customer> customers)
{
   ... implementation ...
}

如果您将参数声明为IEnumerable&lt; Customer&gt;,您的调用者可以使用以下代码轻松传入集合的子集(在.NET 3.5之前:使用.NET 3.5,您可以使用lambda表达式):

private IEnumerable<Customer> GetCustomersByCountryCode(IEnumerable<Customer> customers, int countryCode)
{
    foreach(Customer c in customers)
    {
        if (c.CountryCode == countryCode) yield return c;
    }
}

... 
ProcessCustomers(GetCustomersByCountryCode(myCustomers, myCountryCode);
...

一般而言,MS指南建议不要公开List&lt; T&gt;。有关为何如此的讨论,请参阅代码分析(FxCop)团队的this blog entry

答案 1 :(得分:0)

我倾向于同意不在API中返回或使用List或Dictionary作为参数,因为它确实限制了针对API的开发人员。而是返回或传递IEnumerable&lt;&gt;效果很好。

粗略地说,所有这些都取决于应用程序。只是我的意见。

答案 2 :(得分:0)

也许你的朋友读过: Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries

这是一本很棒的书,它详细介绍了这样的问题。