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

本文关键字:代码 约定 是什么 集合 返回值 参数 | 更新日期: 2023-09-27 17:47:46

我和一个朋友讨论了在方法的返回/输入值中使用集合的问题。他告诉我我们必须使用-返回值的派生类型最多。-输入参数的最小派生类型。

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

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

对吗?

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

关于输入参数,通常使用最不特定的类型更灵活。例如,如果您的方法要做的只是枚举作为参数传递的集合中的项,那么接受IEnumerable<T>。

例如,考虑一个方法"ProcessCustomers",它接受一个客户集合参数:

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

如果将参数声明为IEnumerable<客户>,调用方可以使用以下代码轻松地传入集合的子集(在.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<T>。关于为什么会这样的讨论,请参阅代码分析(FxCop)团队的这篇博客文章。

我倾向于不返回或使用List或Dictionary作为API的参数,因为这确实限制了开发人员以API为目标。而是返回或传递IEnumerable<>效果非常好。

当然,这一切都取决于应用程序。只是我的看法。

也许你的朋友读到了:框架设计指南:可重用.NET库的惯例、习语和模式

这是一本伟大的书,它详细地涵盖了这样的问题。