返回IAsyncEnumerable的方法名称应带有“ Async”后缀吗? [关闭]

问题描述 投票:2回答:1

[在C#5为异步编程引入asyncawait模型之后,可接受的命名约定是在返回等待类型的方法中添加“异步”后缀,如下所示:

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();
}
c# c#-8.0
1个回答
0
投票

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#会抱怨。这将是完全相同的方法,但是它将以另一种方式进行工作。就像多态一样。就像界面一样。
© www.soinside.com 2019 - 2024. All rights reserved.