2016-10-06 80 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關鍵字不需要。