最佳类型设置为返回集合的方法的返回类型?

Nat*_*ate 11 .net c#

返回收藏品对我们来说哪种类型最好?

我应该使用IList<T>,IEnumerable<T>,IQueryable<T>,别的东西吗?哪个最好,为什么

我正在尝试决定我应该使用哪种方式,无论是在接口还是我正在编写的几个类的实现中.

编辑让我更进一步,我使用LINQ to SQL通过WCF服务返回数据.感觉这可能会改变最佳使用类型?

Cha*_*ana 5

使用所有可能的返回类型将符合的最不一般的类型.也就是说,如果您正在查看的方法可能会返回a List<int>或a int[],那么我会输入IEnumerable<int>...如果它可以返回,List<int>或者我List<Employee>或者int[]键入为IEnumerable.如果它总是返回a Collection<Employee>或者Collection<SalariedEmployee>然后返回Collection<Employee>

如果方法将始终生成相同的类型,请使用该类型...

在一个耗时的方法或接口,OTOH,正在返回的对象是在哪里使用,应使用相对理念,键入传入方法参数作为至少一般是由在消费方法的代码的内部功能所需的类型..即,如果所有方法都使用集合对象进行枚举foreach,那么传入的参数类型应该是IEnumerable<>


Jus*_* R. 5

框架设计指南状态:

使用Collection<T>Collection<T>属性的子类 或返回表示读/写集合的值.

public Collection<Session> Sessions { get; }
Run Code Online (Sandbox Code Playgroud)

使用ReadOnlyCollection<T>,子类ReadOnlyCollection<T>,或在极少数情况下IEnumerable<T>使用表示只读集合的​​属性或返回值.

public ReadOnlyCollection<Session> Sessions { get; }
Run Code Online (Sandbox Code Playgroud)

一般来说,更喜欢 ReadOnlyCollection<T>.

关于LINQ,为.NET 3.5创建的指南很明确,但在理由上并没有(imo)完全令人信服:

审查机构明确决定LINQ不应改变本指南["不要返回IEnumerator<T>,除非作为方法的返回类型 GetEnumerator"].如果调用者选择不使用LINQ或不支持LINQ的语言,则他们最终会得到一个笨拙的对象模型.

  • 那些是.NET 3.5之前的准则吗?想知道LINQ是否让我向IEnumerable <T>漂移. (3认同)

Mik*_*Two 1

我默认为 IEnumerable。我正在拍摄要公开的最小界面。两者IList<T>兼而有之。IQueryable<T>IEnumerable<T>因此,除非您对方法有其他特定要求,否则我会选择极简主义并使用最少派生的类型。如果您的调用代码有其他要求,例如索引查找的性能或获取集合中的项目数,那么您可能需要选择其他类型,例如ICollection<T>.

  • @fatcat1111 - 你是对的,但这通常是我返回集合时我想要支持的唯一场景。如果我想修改集合或做其他事情,那么我将为此提供描述性方法。我不会返回 IList&lt;Employee&gt; 以便有人可以对其调用 Add 。我将有一个 AddEmployee 方法。 (2认同)
  • @Nate - 更像是 `IEnumerable&lt;T&gt; result = obj.ReturnIEnumerable();` 您可以将变量声明为接口类型。它实际上使您可以更灵活地编写 `ReturnIEnumerable()` 它可以返回 List&lt;T&gt; 或 HashSet&lt;T&gt; 或 LinkedList&lt;T&gt; 或者它可以执行 `yield return ...`永远不需要知道。如果 IEnumerable&lt;T&gt; 的约定就足够了,而且由于 LINQ,它通常就足够了,那么将其保留为 IEnumerable&lt;T&gt;。 (2认同)