【发布时间】:2020-05-17 21:58:29
【问题描述】:
在 C# 中使用丢弃是否有任何性能优势?在 Visual Studio 2019 中,编辑器建议对不使用返回值的返回类型方法使用丢弃。
【问题讨论】:
-
这能回答你的问题吗? What are the advantages of discards in c#
在 C# 中使用丢弃是否有任何性能优势?在 Visual Studio 2019 中,编辑器建议对不使用返回值的返回类型方法使用丢弃。
【问题讨论】:
根据MSDN
丢弃临时的、有意的虚拟变量 在应用程序代码中未使用。丢弃相当于未分配 变量;它们没有价值。因为只有一个 丢弃变量,并且该变量甚至可能不会被分配存储, 丢弃可以减少内存分配。
如您所见,您可以减少内存使用量,因为它们可能不会被分配。但确切的行为取决于代码的上下文。
discards的主要用例是元组,switch表达式中的模式匹配
switch (obj)
{
case SomeType someTypeValue:
...
break;
case null:
...
break;
case object _:
...
break;
}
带有out参数的方法
if (int.TryParse(s, out _))
{
}
如你所愿,只需忽略来自方法 _ = Task.Run(() => {...}); 的返回值。
就简洁的代码而言,还有一个很大的可用性优势。通过使用丢弃_,您表明返回值是未使用的
【讨论】:
据我所知,使用丢弃没有什么好处。它与未分配的变量相同,因此更少的内存使用是一个好处。有多少好处是未知的。 Visual Studio 还不断建议我使用丢弃,但我只是从弹出窗口中隐藏了该消息。
【讨论】:
嗯。视情况而定。
(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) 这样的代码。而且据我所知,编译器非常聪明。
在那个例子中,反汇编代码看起来都和我一样,所以真的没有区别。
【讨论】: