考慮一個C#API與方法有出或裁判參數,如自定義的結構:元組對與REF/out參數的方法的異步版本
Person FindPerson(string name, out int searchTime);
我們不注意out和ref參數通常是一種設計氣味,假設這是一個傳統的API,我們不能改變其現有方法的簽名。但我們需要擴展API以支持異步執行(Windows Phone,WinRT應用程序)。以下是不會編譯的實現:
Task<Person> FindPersonAsync(string name, out int searchTime)
{
return Task.Factory.StartNew(() => this.FindPersonAsync(name, out searchTime));
}
此實現不會編譯由於出參數。所以我們必須改變API簽名。一種方法是將人員任務的結果更改爲人員和人員的元組任務,即委託實現將返回人員元組和元組。第二種選擇是定義一個自定義結構。
元組優勢:使用元組給出了一種非常正式的方法,可以用來爲任何API輕鬆定義異步版本。可預測的實現(沒有新的名字定義)。使用自定義結構需要爲每個這種情況創建新的類型和成員。
自定義結構優勢:使用元組的客戶端代碼需要參考使用項目1和項目2名的元組元素。這是模糊的。
我還沒有找到任何建議,暫時決定使用元組。但是,我想知道在使用asyns支持擴展API時是否有推薦的方法來處理這些方法。
這是非常主觀的。它們都工作,既不完美,運行時也不在乎。選擇你的毒藥。做檢查[這個元問題](http://meta.stackexchange.com/questions/142353/why-is-asking-a-question-on-best-practice-a-bad-thing) – 2013-03-27 01:02:59
你的代碼可能更清晰如果你使用'TimeSpan'而不是'int'作爲'searchTime'結果。 – 2013-03-30 05:23:04
同意TimeSpan可能是新API的更好選擇。但是我正在處理現有的版本,並希望保持異步版本儘可能接近原始版本。 – 2013-03-31 09:30:49