【发布时间】:2020-02-04 13:20:41
【问题描述】:
从 C# 7 开始,我们可以使用丢弃 _ 丢弃未使用的变量。我使用它的其中一件事是执行即发即弃的任务。
考虑这种方法:
public Task Example()
{
// Do some fire-and-forget stuff.
}
您可以通过简单地不等待任务来忽略此任务:Example(),但这仍然会给您一个警告。使用 discard 关键字,我们现在可以使用:_ = Example(),它消除了这个警告。我想知道这是否有我应该注意的令人讨厌的副作用? (除了 MSDN 所说的:“这具有抑制操作即将完成时抛出的异常的效果。”)
【问题讨论】:
-
这正是引入丢弃语法的目的。
-
@Sweeper 得到了关于使用这样的丢弃将垃圾收集任务的内部评论。但既然是即发即弃,那肯定没问题吧?
-
嗯,这也取决于上下文。例如,如果这是在命令行应用程序中,任务将无法完成。
-
@Timmeh 我不太了解 GC 处理任务的方式,但我很确定
_ = Example()编译为与Example()相同的 IL。如果后者有效,那么前者也应该有效。 -
_ =可能会影响 GC,取决于您的替代方案。如果您将任务存储到命名变量中,并强制该变量不超出范围,那么_ =可能会导致任务对象比使用变量更早地符合收集条件。但是,这不会阻止任务执行完成,所以一点也不重要。相比于省略_ =,只调用方法,没什么区别。