私はいくつかのコードで作業していますが、そこではロジックとコードが非常に似ている2つのクラスがあります。両方のクラスにprotected async void LoadDataAsync()
メソッドがあります。
現在、私はそれをリファクタリングし、共有ロジックを基本クラスに移動することを考えています。virtual async
基本クラスのメソッドと派生クラスでそれをオーバーライドしますか?
問題はありますか?
私のコードは次のようになります。
public class Base
{
protected virtual async void LoadDataAsync() {}
}
public class Derived : Base
{
protected override async void LoadDataAsync()
{
// awaiting something
}
}
同様の(同じではありません) 質問はすでに尋ねられました.
virtual
メソッドmayasync
としてマークされるabstract
メソッドできないasync
としてマークされるこの理由は、async
は実際にはメソッドシグネチャの一部ではないからです。メソッド本体自体のコンパイルの処理方法をコンパイラに指示するだけです(メソッドのオーバーライドには適用されません)。抽象メソッドにはメソッド本体がないため、async
修飾子を適用しても意味がありません。
基本クラスがメソッドのデフォルトの実装を提供するが、作業を行う必要がない場合は、基本クラスの現在の署名ではなく、以下をお勧めします。
protected virtual Task LoadDataAsync() {
return Task.FromResult(default(object));
}
実装からの主な変更点は次のとおりです。
void
からTask
に変更します(async
は実際には戻り値型の一部ではないことに注意してください)。 void
を返すのとは異なり、Task
が返される場合、呼び出しコードは次のいずれかを実行できます。async
を何も必要としないため、await
修飾子の使用は避けてください。代わりに、既に完了したTask
インスタンスを返すだけです。このメソッドをオーバーライドするメソッドは、必要に応じてasync
修飾子を使用できます。はい、問題ありませんが、async Task
の代わりにasync void
を使用する必要があります。 理由を説明するMSDN記事 があります。