丢弃和不分配变量有什么区别?

Woj*_*322 13 c# c#-7.0

在 c# 7.0 中,您可以使用丢弃。使用丢弃和简单地不分配变量有什么区别?

public List<string> DoSomething(List<string> aList)
{ 
//does something and return the same list
}
_ = DoSomething(myList);
DoSomething(myList);
Run Code Online (Sandbox Code Playgroud)

有什么区别吗?

Zoh*_*led 13

两行代码完全没有区别。
它们都转换为完全相同的 IL:

public void A(List<string> myList)
{
    _ = DoSomething(myList);
}

public void B(List<string> myList)
{
    DoSomething(myList);
}
Run Code Online (Sandbox Code Playgroud)

两者都翻译为:

IL_0000: ldarg.0
IL_0001: ldarg.1
IL_0002: call instance class [System.Private.CoreLib]System.Collections.Generic.List`1<string> C::DoSomething(class [System.Private.CoreLib]System.Collections.Generic.List`1<string>)
IL_0007: pop
IL_0008: ret
Run Code Online (Sandbox Code Playgroud)

你可以自己看 (注意:我实际上看不懂IL,但这是A和B方法的结果)SharpLab

正如 Liam 在他的回答中所写,丢弃对于out您不打算使用的参数、元组解构、模式匹配和 switch 表达式很有用。
您可以在官方文档中阅读所有相关信息

按照 Liam 的评论进行更新: 请注意,我仅指此特定场景。
当按预期使用时,丢弃可以节省内存和/或提高代码的可读性。

  • 不,当按预期使用时(对于输出参数等),它们是内存高效的,只是在这个特定的场景中它们是多余的。 (4认同)

Lia*_*iam 8

丢弃更多用于out您不关心的参数。例如:

if (int.TryParse(123, out _))
{
   ....
}
Run Code Online (Sandbox Code Playgroud)

它们的存在实际上只是为了防止您必须声明一个您不使用的变量。所以上面的旧方法是:

int throwAway;
if (int.TryParse(123, out throwAway))
{
   ....
}
Run Code Online (Sandbox Code Playgroud)

引用文档

因为只有一个丢弃变量,并且该变量甚至可能没有分配存储空间,丢弃可以减少内存分配。因为它们使您的代码意图清晰,所以它们增强了代码的可读性和可维护性。

所以丢弃是内存有效的(尽管这取决于使用情况)(不要将其作为优化;IMO 这非常属于过早优化的领域,因为效率增益很小)但更重要的是它们使您的代码更通过明确表示您不打算对变量做任何事情来可读。

  • @CaptainKenpachi 以什么方式更好?使用正则表达式可能会在内存使用方面花费更多,并且不会让我开始提高代码可读性。不要忘记这个“-3.14e3”是一个有效的整数。[查看这篇文章](/sf/ask/633048601/) (4认同)
  • @CaptainKenpachi int.TryParse 不使用正则表达式这一事实表明,最好不要使用正则表达式。我不太关心进行性能测试,我完全同意 Liam 的评论。任何时候我都会选择可读性而不是性能,除非编写性能关键型代码时 - 即使这样 - 我也会从可读的代码开始,并从那里开始工作,以在需要时提高其性能。 (3认同)
  • 老实说,我会根据可读性而不是优化来选择正则表达式与尝试解析。基于[过早的优化是所有坏事的根源](https://softwareengineering.stackexchange.com/questions/80084/is-premature-optimization-really-the-root-of-all-evil) (2认同)