如何

问题描述:

很多倍,而接受枚举类型编写函数我面对这样的困惑决定API签名。哪个API暴露会从以下选项中更好:如何

public void Resolve(Func<bool>[] howtos) 

public void Resolve(IEnumerable<Func<bool>> howtos) 

public void Resolve(List<Func<bool>> howtos) 

我通常是决定基于以下: 如果输入需要通过添加或删除项目被修改,随后使用List使用别的IEnumerable的。不确定数组选项。

是需要考虑的,而在API决定被曝光有其他点?是否有任何经验法则清楚地确定了哪些情况下应优先于另一方?

感谢

你应该总是接受限制最少的参数类型。

这意味着IEnumerable<T>,ICollection<T>IList<T>
这种方式,客户端可以*地通过任何种类的实现,如阵列,HashSet<T>,或ReadOnlyCollection<T>

具体而言,您应该采取IEnumerable<T>如果你只需要遍历数据,ICollection<T>如果你也想添加或删除项目,或者如果您需要了解大小,IList<T>如果你需要随机访问(索引)。

+0

ReSharper的通常会告诉你,当你没有限制最少的类型。 – 2011-03-02 18:06:16

+0

@Yuriy:至于代码分析。 – SLaks 2011-03-02 18:06:43

你的方法听起来不错。我唯一会改变的是IList<T>而不是List<T>。允许用户例如验证您添加到列表中的任何内容。

为我作出这个决定的主要因素是

什么是真正解决与集合在做什么?

如果解决方案没有以任何方式改变集合,那么我绝对会更喜欢IEnumerable<Func<bool>>签名。它允许使用最多的用例,并最准确地表达API的意图。我认为任何采取更具体的类型如List<T>的人都打算修改传入的集合。看到IEnumerable<T>给了我一点保证,收集只是被枚举。

如果解决在变异集合然后我宁愿List<T>签名,表明突变确实是可能的。我们可能会通过取回IEnumerable<T>来创建流畅的界面。这将取决于Resolve方法的类型。当我选择一个时很难概括。

+0

谢谢。很好的解释。 +1 – *user 2011-03-03 00:31:28