[在C#5为异步编程引入async
和await
模型之后,可接受的命名约定是在返回等待类型的方法中添加“异步”后缀,如下所示:
interface Foo
{
Task BarAsync();
}
现在C#8引入了异步枚举的概念,它们本身不是可以等待的,但可以与await foreach
结合使用,返回异步枚举的方法名称是否应带有“ Async”后缀?以下是两个选项:
interface Foo
{
// No "Async" suffix, indicating that the return value is not awaitable.
IAsyncEnumerable<int> Bar();
}
或
interface Foo
{
// With "Async" suffix, indicating that the overall logic is asynchronous.
IAsyncEnumerable<int> BarAsync();
}
Async后缀,甚至关键字async
只是样板,除了一些向后兼容性参数之外,它没有任何意义。 C#具有所有信息来区分那些功能,就像在返回yield
的方法中区分IEnumerable
一样,您知道您不需要在此类方法上添加enumerable
或其他关键字。
Async
后缀,只是因为C#会抱怨重载,所以基本上这两个是相同的,并且在所有多态规则下它们都做相同的事情(如果我们不考虑人为破坏行为的因素的话) ):public interface IMyContract
{
Task<int> Add(int a, int b);
int Add(int a, int b);
}
但是您不能这样写,因为编译器会抱怨。但是,嘿!它将吞噬这一怪物:
public interface IMyContract : IEnumerable<int>, IEnumerable<long> { }
甚至是这个:
public interface IMyContractAsync { Task<int> Add(int a, int b); } public interface IMyContract : IMyContractAsync { int Add(int a, int b); }
就这样。您添加只是为了阻止编译器抱怨。不澄清事情。不要让他们变得更好。如果没有抱怨-没有理由添加它,那么在您的情况下,除非它变为Async
Task<IAsyncEnumerable>
,否则我将避免这样做。 PS:在这里只是为了更好地理解整个图片-如果将来某个时候添加了将在不同范例中运行的C#量子计算机方法扩展(fantazy,huh),我们可能需要另一个后缀,例如Quant
之类的东西,因为C#会抱怨。这将是完全相同的方法,但是它将以另一种方式进行工作。就像多态一样。就像界面一样。