在 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 的评论进行更新:
请注意,我仅指此特定场景。
当按预期使用时,丢弃可以节省内存和/或提高代码的可读性。
丢弃更多用于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 这非常属于过早优化的领域,因为效率增益很小)但更重要的是它们使您的代码更通过明确表示您不打算对变量做任何事情来可读。