我和一位朋友就一个方法的返回值/输入值中的集合用法进行了一些讨论。他告诉我,我们必须使用 - 返回值的派生类型最多。 - 输入参数的派生类型最少。
因此,这意味着,例如,方法必须将ReadOnlyCollection作为参数,并返回List。
此外,他说我们不能在公共API中使用List或Dictionary,而我们必须使用,而不是Collection,ReadOnlyCollection,......所以,在方法是公共的情况下,它的参数和它的返回值必须是Collection,ReadOnlyCollection,......
是不是?
答案 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
这是一本很棒的书,它详细介绍了这样的问题。