如果我有一个继承基类的类,并且这两个类都继承了这个接口
public interface BaseClass
{
Task<object> GetAsync();
}
如果基类将其方法实现为:
public async Task<object> GetAsync()
{
object o = async DoSomethingAsync();
return o;
}
继承基类的类会覆盖该方法,但仍会调用基类方法,如果你把async等待了,这有关系吗? e.g?
// Option 1
public async Task<object> GetAsync()
{
DoSomethingElse();
return await base.GetAsync();
}
// Option 2
public Task<object> GetAsync()
{
DoSomethingElse();
return base.GetAsync();
}
两者有什么区别?有没有?
答案 0 :(得分:-1)
调用基类方法与在这方面从不同类调用方法没什么不同,你仍然应该添加'await'。没有它,你的派生方法将同步执行。
答案 1 :(得分:-1)
尽管它似乎是签名的一部分,但async
实际上是它装饰 1 的方法的实现细节。没有必要用async
来装饰方法,因为它覆盖了使用它实现 的方法。
选项2没问题。
有一个github issue与将选项1自动重写为选项2有关,但我不确定是否/何时会到达,因为有一些反对它的论据(特别是在例外的情况下) )
1 作为进一步的证据表明它不是签名的一部分,在定义界面成员时甚至不允许使用async
。