有关集合的退货类型的问题

时间:2009-08-12 20:24:35

标签: c# collections

在我的BL(将是一个公共API)中,我使用ICollection作为我的Find方法中的返回类型,例如:

public static ICollection<Customer> FindCustomers()
{
   Collection<Customer> customers = DAL.GetCustomers();

   return customers;
}

请注意使用ICollection而不是Collection&lt;&gt;。

现在在我的GUI中,我需要将结果转换回Collection,例如:

Collection<Customer> customers = (Collection<Customer>)BL.FindCustomers();

这是因为我需要使用一些Collection&lt;&gt;我返回列表中的具体方法,我无法使用ICollection&lt;&gt;。

这是正确的用法吗?或者我应该简单地从Collection&lt;&gt;更改返回类型而不是ICollection&lt;&gt;为了避免这种演员?

其次,我没有使用IEnumerable,因为它比ICollection更通用,甚至没有像Count那样的简单属性。我真的没有看到在这里概括返回类型的重点。我错过了一些重要的事情吗?

6 个答案:

答案 0 :(得分:2)

使用ICollection的重点是更通用,隐藏更多信息,这是一件好事。

但是如果你需要将它转换回来它就变得毫无意义了,你也可以返回功能更强大的Collection&lt; &GT;代替。

答案 1 :(得分:2)

您想要返回ICollection的唯一原因是松散耦合和继承属性。如果您的方法只有一个版本(因为它的静态),您将始终知道返回类型(Collection),并且不需要将其设置为ICollection。但是,如果您在一个类系列中使用,可能会有一个返回和ICollection的虚拟或抽象方法,那么在子类实现中,可以返回一个Collection或FunkyCollection或任何实现该接口的对象,因此这会给你一个更多的灵活性,说你只能返回一个集合。但是为了你的目的,你应该只是生成返回类型Collection而不是ICollection,因为它是一个不会被覆盖的静态方法。此外,它会减少用户的混淆,因为他们不需要施放。

答案 2 :(得分:0)

返回ICollection的想法是,在方法上的耦合较少。如果您想稍后构建一个List,而不是一个Collection,那么您将能够在不破坏客户端代码等的情况下完成它。

如果你只是为了得到一个集合(而不是ICollection)而使用它,那么你可以改成收集,知道你将有一个不太灵活的方法。但无论如何,YAGNI

此外,如果您担心设计问题,我建议您不要将此设置为improve the testability代码。

答案 3 :(得分:0)

这可能是因为Collection实现了IList,它有一些ICollection没有的额外方法,IList足够你。 你错过了哪些方法?

答案 4 :(得分:0)

如果您要求用户使用Collection&lt;&gt;的方法,您应该返回Collection&lt;&gt;而不是ICollection。

或者也许使用具有组件内部的单独函数,它返回GUI所需的类型:

internal static ICollection<Customer> FindCustomers()
{
    Collection<Customer> customers = DAL.GetCustomers();

    return customers;
}

答案 5 :(得分:0)

其他人已经给出了如此好的答案,但我只想澄清一点,不,我不相信你在做什么是理想的。这样做的原因是,如果有人稍后出现并修改/重构/重新实现您的BL以返回其他类型的ICollection(根据API)并非真正的Collection,您将获得GUI中的运行时错误。

但是,您仍然可以选择从BL中返回ICollection:然后,如果您真的想要Collection(可能,对于一种或多种方便的扩展方法,我可能猜猜?),那么你可以创建一个新的集合并将内容从一个复制到另一个。这样,您就不会冒运行时错误的风险。虽然,它最终取决于(正如其他人已经问过的)你在Collection中寻找哪种方法...也许有更好的方法来做你想做的事。

祝你好运!
-f!