【问题标题】:Using discards in C# for return methods [duplicate]在 C# 中使用丢弃作为返回方法 [重复]
【发布时间】:2020-05-17 21:58:29
【问题描述】:

在 C# 中使用丢弃是否有任何性能优势?在 Visual Studio 2019 中,编辑器建议对不使用返回值的返回类型方法使用丢弃。

【问题讨论】:

标签: c# c#-7.0


【解决方案1】:

根据MSDN

丢弃临时的、有意的虚拟变量 在应用程序代码中未使用。丢弃相当于未分配 变量;它们没有价值。因为只有一个 丢弃变量,并且该变量甚至可能不会被分配存储, 丢弃可以减少内存分配。

如您所见,您可以减少内存使用量,因为它们可能不会被分配。但确切的行为取决于代码的上下文。

discards的主要用例是元组,switch表达式中的模式匹配

switch (obj)
{
     case SomeType someTypeValue:
        ...
        break;
     case null:
        ...
        break;
     case object _:
        ...
        break;
}

带有out参数的方法

if (int.TryParse(s, out _))
{    
}

如你所愿,只需忽略来自方法 _ = Task.Run(() => {...}); 的返回值。

就简洁的代码而言,还有一个很大的可用性优势。通过使用丢弃_,您表明返回值是未使用的

【讨论】:

    【解决方案2】:

    据我所知,使用丢弃没有什么好处。它与未分配的变量相同,因此更少的内存使用是一个好处。有多少好处是未知的。 Visual Studio 还不断建议我使用丢弃,但我只是从弹出窗口中隐藏了该消息。

    【讨论】:

    • 我更喜欢使用丢弃物。它使代码的意图更加清晰。
    【解决方案3】:

    嗯。视情况而定。

    (1) 没有丢弃,你需要类似的东西:

                string foo = "fish";
                bool parsingok2 = Double.TryParse(foo, out double res);
    

    (2) 有了discards,写起来会容易一些:

                string foo = "fish";
                bool parsingok1 = Double.TryParse(foo, out _);
    

    所以。如果编译器很聪明并且注意到 (1) 中的 res 从未使用过,它可以自动构建像 (2) 这样的代码。而且据我所知,编译器非常聪明。

    在那个例子中,反汇编代码看起来都和我一样,所以真的没有区别。

    【讨论】:

      猜你喜欢
      • 2011-04-06
      • 1970-01-01
      • 2018-05-02
      • 2014-07-06
      • 1970-01-01
      • 2019-06-27
      • 2017-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多