使用方法内的"ToListAsync()"返回IEnumerable

agf*_*gfc 6 .net c#

目前我正在使用其他人的代码.这不是我第一次看到这样的事情:

public async MyMethod Task<IEnumerable<MyResult>> FindResults()
{
// some code here
var ret = await repository.BusinessObjects.ToListAsync()

return ret;

}
Run Code Online (Sandbox Code Playgroud)

我的问题是:在MyMethod返回类型中使用IEnumerable是不是适得其反,因为结果已经枚举,并且最好保持这种方式?使用List不是更好吗?

(我想它也适用于非异步操作,但我决定以我在代码中看到的方式显示这个以防万一)

Igo*_*gor 6

从技术上讲,以这种方式编写代码没有问题.在上面的特定代码示例中,如果要返回List<>实例但方法的返回类型是(技术上)并不重要IEnumerable<>.没有性能损失,实际返回的类型仍然是List<>.

据说这不是好习惯.有一个设计指南,声明你应该构造你的方法,以便始终返回尽可能最具体的类型接受最通用/抽象类型(当然,在限制范围内,你不应该将对象作为每个方法的参数).

请参阅本文标题为" 返回最具体的类型",接受 Vladimir Khorikov 最常用的类型作为参考.之前也问过这个问题,请参阅从动作方法返回最具体或最常用的类型是否更好?.

所以这意味着以下2个签名将是良好的做法(使用您的示例),假设第一个签名a List<MyResult>是实际返回的类型,而在第二个示例中,无论做什么更新只需要迭代输入.

public async Task<List<MyResult>> FindResultsAsync();
public async Task UpdateAsync(IEnumerable<MyResult> itemsForUpdate);
Run Code Online (Sandbox Code Playgroud)

  • 原则上同意,但不同意返回 `List&lt;T&gt;`,因为这会阻止您在不破坏消费者的情况下更改方法定义以返回不同的集合类型(例如 `ObservableCollection&lt;T&gt;`)。更好的做法是返回“IList&lt;T&gt;”(或“ICollection&lt;T&gt;”)。 (2认同)