System.Diagnostics.ConditionalAttribute
对于分割调试代码片段非常有用,无需使用编译器指令,但它只与返回void
的方法兼容。
有没有办法为返回Task
的异步方法使用它(或等效的东西)?
答案 0 :(得分:11)
没有
可以毫无问题地删除void方法,因为无论是否存在方法调用,评估堆栈的净效果都是相同的:零。
无法删除非void方法,因为在删除它的情况下,堆栈上没有任何东西,并且在没有删除它的情况下,堆栈上有一件事:对a的引用任务。
换句话说:你期望这样做:
Foo(BarAsync());
如果Foo
需要Task
而BarAsync
被移除?
答案 1 :(得分:4)
有没有办法为返回
Task
的异步方法使用它(或等效的东西)?
与任何返回值的函数相同:将调用包装在一个返回void
的辅助方法中,通过ref
参数“返回”该值。是的,它很笨拙,但是这样你就不得不为return参数编写一个初始化器,并且即使调用被删除,初始化器也是如何有效的:你永远不会得到未初始化的值。
[Conditional("DEBUG")]
public void FooAsync(ref Task task) {
Func<Task> impl = async () => {
// ...
};
task = impl();
}
用法:
public async Task CallFoo() {
var task = Task.CompletedTask;
FooAsync(ref task);
await task;
}