【问题标题】:Does discarding a task with the discard keyword cause any side-effects?使用discard关键字丢弃任务会导致任何副作用吗?
【发布时间】: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,取决于您的替代方案。如果您将任务存储到命名变量中,并强制该变量不超出范围,那么_ = 可能会导致任务对象比使用变量更早地符合收集条件。但是,这不会阻止任务执行完成,所以一点也不重要。相比于省略_ =,只调用方法,没什么区别。

标签: c# c#-7.0


【解决方案1】:

discard 语法只是一个语法糖,用于抑制“此表达式的返回值未使用”的警告。这两行编译为相同的 IL:

_ = Example();
Example();

它们都变成了相同的call 指令。

因此,如果Example() 适合您,那么_ = Example() 也适合您。

【讨论】:

    猜你喜欢
    • 2012-12-28
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 2018-12-21
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多