标记仅使用条件属性返回任务的异步方法?

Mat*_*cey 6 c# async-await

System.Diagnostics.ConditionalAttribute对于分割调试代码片段非常有用,无需使用编译器指令,但它只与返回的方法兼容void.
有没有办法使用它(或等效的东西)的异步方法返回Task

Eri*_*ert 11

没有.

可以毫无问题地移除void方法,因为无论是否存在方法调用,评估堆栈的净效果都是相同的:零.

无法删除非void方法,因为在删除它的情况下,堆栈上没有任何东西,并且在没有删除它的情况下,堆栈上有一件事:对任务的引用.

换句话说:你期望这样做:

Foo(BarAsync());
Run Code Online (Sandbox Code Playgroud)

如果Foo需要一个Task并被BarAsync删除?

  • 我希望它可以做 `Foo((Task)Task.FromResult(0));`,就像每个现代模拟库一样。 (2认同)
  • @StephenCleary:为什么不是“默认(任务)”?如果该方法返回除“Task”之外的类型该怎么办——比如“ValueTask”;有多少类型得到特殊待遇。为什么任务返回方法很特殊,因为它们可以被删除,但返回其他类型的方法却不能?这些问题当然都是可以解决的;问题是解决这些问题是否值得推迟或消除某些可能对更多用户更有价值的其他功能。 (2认同)
  • 我同意从这个角度来看,“任务”和“操作”是相似的。但有一个重要的区别 - “Action” 直到将来才会“开始”,而“Task”(以异步思维方式)已经“已经”开始。因此,人们可以给出“null”“Action”语义,但不能给出“null”“Task”语义(同样,在异步思维方式中)。这就像调用者开始一个操作,然后该操作就消失了(没有完成 - 只是消失了)。 (2认同)