方法返回Task的接口命名规范

7
考虑以下接口和实现。
interface IService
{
    Task<string> GetAnswer(string question);
}

class SomeService : IService
{
    async Task<string> IService.GetAnswer(string question)
    {
        ... code using awaits ...
    }
}

class AnotherService : IService
{
    Task<string> IService.GetAnswer(string question)
    {
        return Task.FromResult("I have no idea.");
    }
}

根据Microsoft 命名规范,接口方法应该命名为GetAnswer还是GetAnswerAsync
引用如下:

按照惯例,对于具有 Async 或 async 修饰符的方法,将“Async”附加到名称。

问题在于第一种实现使用了async修饰符,表示它应该接收“Async”方法名称后缀,但第二种实现没有使用async修饰符,表示它不应该接收“Async”方法名称后缀。接口强制两个实现的方法名称相同,因此我被迫违反其中一个类的命名约定。
请注意,我不是寻求有意见的答案。请把它看作是多项选择题。 :)
  1. 你应该使用“Async”后缀,因为命名规范是这样规定的。(参考资料。)
  2. 你不应该使用“Async”后缀,因为命名规范是这样规定的。(参考资料。)
  3. 命名规范没有规定。(需要由精通命名规范的人提供信息。)

6
我对人们基于“主要基于个人意见”而投票关闭这个问题感到困惑。这是一个关于Microsoft命名约定内容的客观问题。我想知道的是,是否有一些关于接口方法返回Task的部分,或者在命名约定中根本没有提到。这不是基于个人意见的。 - Timothy Shields
3
我同意,规定不是意见。 - Jeroen Vannevel
2
@JeroenVannevel 惯例绝对是观点。 - Servy
1
@Servy:如果你要这样字面上看待它,那么有很多规则需要被打破。事实仍然是,惯例通常被视为一条规则,因此这样一个问题所能引起的讨论是有具体限制的。 - Jeroen Vannevel
1
@Servy,“Microsoft方法命名约定是否包含“elephant”一词?”这个问题是一个客观的问题,不留任何争论或辩论的余地。这个问题也不例外:它询问的是Microsoft方法命名约定是否包含特定接口方法返回任务的引用。我已经搜索过了,但没有找到,所以我在这里提问。我已经得到了答案,所以痛苦也结束了。 :) - Timothy Shields
显示剩余3条评论
1个回答

7
即使方法没有 async 修饰符,只要该方法表示完整的基于任务的异步操作,您仍应使用 XAsync
从技术上讲,引用的段落告诉您在有 async 修饰符时添加 Async,但未说明在没有任何修饰符时该怎么做。 async 修饰符实际上不是方法签名的一部分,您可以轻松地在没有它的情况下实现完全相同的行为。如果查看 基于任务的异步模式,您将找不到特定的 async 修饰符的参考,而是更广泛定义的 async 方法。
在.Net框架本身中,您甚至无法知道哪个异步方法实际上使用了async修饰符。很多(如果不是大多数)返回TaskCompletionSource.Task以允许您(作为用户)使用async-await。例如,这是Stream.WriteAsync
public virtual Task WriteAsync(Byte[] buffer, int offset, int count, CancellationToken cancellationToken)
{
    // If cancellation was requested, bail early with an already completed task.
    // Otherwise, return a task that represents the Begin/End methods.
    return cancellationToken.IsCancellationRequested
                ? Task.FromCancellation(cancellationToken)
                : BeginEndWriteAsync(buffer, offset, count);
}

1
从技术角度来看,你引用的那段话告诉你在有异步修饰符时添加异步,但没有说明在没有异步修饰符时该怎么做。这就完全概括了。 - Timothy Shields

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接