问题描述
在c#7.0中,可以使用丢弃。使用丢弃和不分配变量之间有什么区别?
public List<string> DoSomething(List<string> aList)
{
//does something and return the same list
}
_ = DoSomething(myList);
DoSomething(myList);
有什么区别吗?
解决方法
两条代码行之间绝对没有区别。
他们两个都转换为完全相同的IL:
public void A(List<string> myList)
{
_ = DoSomething(myList);
}
public void B(List<string> myList)
{
DoSomething(myList);
}
两者都翻译为:
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
您可以自己在SharpLab上看到它
(注意:我实际上无法读取IL,但这是A和B方法的结果)
正如Liam在他的回答中所指出的,对于不使用的out
参数,元组解构,模式匹配以及开关表达式,丢弃是有用的。
您可以在official documentation.
根据Liam的评论进行更新:
请注意,我仅指的是这种特定情况。
按预期使用时,丢弃将提高内存效率和/或提高代码的可读性。
out
不需要的参数更多。例如:
if (int.TryParse(123,out _))
{
....
}
它们的存在仅是为了防止您必须声明不使用的变量。因此,执行上述操作的旧方法是:
int throwAway;
if (int.TryParse(123,out throwAway))
{
....
}
引用the docs:
因为只有一个丢弃变量,并且可能甚至没有为该变量分配存储空间,所以丢弃可以减少内存分配。因为它们使您的代码意图清晰明了,所以可以增强其可读性和可维护性。
因此,丢弃是提高内存效率的(尽管是depends on usage)(不要这样做是最优化的;因为效率,IMO很大程度上属于过早优化的领域收益很小),但更重要的是,通过使您不打算对该变量执行任何操作,它们使您的代码更具可读性。
,以下两行在编译级别没有区别。
_ = foo();
foo();
IDE级别的细微差别:foo();
可以在2019年之后的Visual Studio中显示警告,因为您没有使用函数的返回值。
根据MSDN,
丢弃可以减少内存分配。因为他们表达了意图 清晰的代码,可以增强其可读性和可维护性。
参考:https://docs.microsoft.com/en-us/dotnet/csharp/discards
以下链接也可能有帮助。
与其他范式相比,抛弃物似乎具有更高的罪恶感 在C#的最新版本(如元组)中引入 解构。