2016-10-06 44 views
25

这也许是一个简单的问题,但目前即时通讯做了未来的同事一些内联文档和偶然发现类似的东西:async(void)方法摘要方法:返回什么?

/// <summary> 
/// This Class is totaly useless 
/// </summary> 
public class DummyClass { 

    /// <summary> 
    /// Will do nothing 
    /// </summary> 
    public void DoNothing() { 
    } 

    /// <summary> 
    /// Will do nothing async 
    /// </summary> 
    /// <returns></returns> <---- What to write here? 
    public async Task DoNothingAsync() { 
    await Task.Run(() => { }); 
    } 

} 

正如你可能知道,打字的方法/字段/类以上3个斜线/什么触发VisualStudio执行Summary-Snippet-Completion。

问题

Task实际上是一个有效的返回值?如果是这样,我在<returns></returns>写什么?

我当然知道,我可以忽略这个,但为了完整性,我愿意在那里写东西。

+1

要么没有,要么是空的任务。我很想把它作为一个空白的'returns'标签,因为文档不是要教人们关于编程的东西(所以我建议不要说像'等待任务'这样的东西 - 这对开发人员来说很清楚理解c#中的异步),但要描述你的方法 - 它什么都不返回。 – Rob

+3

仅供参考,DoNothingAsync实际上会产生一个线程无所事事,因此我认为它不会做任何事情; P更好的办法是不做任何事情, 'Task.FromResult(0)'。 (我知道这只是为了演示目的) – poke

回答

21

如果我们从API's that Microsoft灵感最近生产的,你可能只是状态:

<returns>No object or value is returned by this method when it completes.</returns> 

我不喜欢出于同样的原因,我不会装点返回的方法“可以等待任务对象”一个int用“可以比较为零或用于数学运算的整数” - 它不描述方法的返回值,它描述了类型。该类型有其自己的文件,可以咨询。

12

就我个人而言,我更喜欢在这种情况下删除<returns></returns>部分。

当你返回一个Task时,你实际上返回一个对象,允许调用者知道方法何时结束(以各种方式,其中之一是await它)。你实际上并没有返回任何方法的结果(当你返回Task<T>时你的方式),所以你只是返回一个与调用者沟通的方式。

如果你有写的东西,我喜欢的东西,是有帮助的任何人使用API​​来:

/// <returns>A task object that can be awaited</returns> 
+3

我也将其删除。记录的是用于共享有关函数返回的信息,而不是C#如何工作。如果你返回“int”,写出“一个正数或负数的数值”是一样的,而且我确定这感觉不必要:) –

+0

哈哈哈真是太神奇了,我只是意识到达米安使用**完全相同的例子和我一样! –

+1

@Zil文档对任何使用API​​的人都有用。如果作者需要写点东西的话,我觉得这一行很有用。否则我仍然喜欢删除那部分。事情就像,*这个方法没有返回*如果你写了'Task t = DoNothingAsync() – user3185569

3

由于从MSDN

每个返回任务表示正在进行的工作。任务最终会封装 关于异步进程状态的信息,最终会封装进程的最终结果或进程在未成功时引发的异常 。

所以,你可以写你的方法返回一个作品(=一个任务,我倒是认为一个有效的返回式),当执行你的情况不返回任何内容(void)。

2

如果简化 - 这回像void,所以你甚至可以写awaitable无效是回报。

但是如果认真的话当然会返回任务实际上是一个有效的返回值。

3

任务实际上是一个有效的返回值?

绝对。这就是异步状态机在掩护下所依赖的。从语义上讲,在方法主体中定义的返回类型没有相应的return语句时,总会有很多混淆。这种方法可以写成这样,而不是:

public Task DoNothingAsync() 
{ 
    return Task.Run(() => { }); 
} 

我写什么在<returns></returns>

当我利用<summary></summary>文档的功能,我通常不填充<return></return>智能感知就已经告诉你的类型。另外,它会告诉你它是否是一个“(等待)”,这真的是这里的关键。如果你正在编写一个返回Task的方法,那么它是可以等待的,那真的是最重要的部分。

如果你觉得有义务来形容的话,我建议这么做,因为这样的:

<returns> 
    A <see cref="Task"> object that represents an asynchronous operation. 
</returns> 

同样,IDE会让你知道,当你消费这个功能,这是“awaitable”。

enter image description here

注:

AsyncFixer是一个扩展,将突出你的建议,比如告诉你,这些实际上应该是return语句来代替,而且asyncawait关键字不需要。