在 C# 中为 return 方法使用丢弃
Using discards in C# for return methods
在 C# 中使用丢弃有任何性能优势吗?在 Visual Studio 2019 年,编辑建议对未使用 returned 值的 return 类型方法使用丢弃。
据我所知,使用丢弃物几乎没有什么好处。它与未分配的变量相同,因此减少内存使用量是一个好处。好处有多大,不得而知。 Visual Studio 也一直建议我使用丢弃,但我只是从弹出窗口中抑制了该消息。
根据MSDN
Discards which are temporary, dummy variables that are intentionally
unused in application code. Discards are equivalent to unassigned
variables; they do not have a value. Because there is only a single
discard variable, and that variable may not even be allocated storage,
discards can reduce memory allocations.
如您所见,您可以减少内存使用量,因为它们可能未被分配。但确切的行为取决于代码的上下文。
丢弃的主要用例是元组,switch
表达式中的模式匹配
switch (obj)
{
case SomeType someTypeValue:
...
break;
case null:
...
break;
case object _:
...
break;
}
具有 out
个参数的方法
if (int.TryParse(s, out _))
{
}
并根据需要忽略方法 _ = Task.Run(() => {...});
中的 return 值。
在干净的代码方面也有很大的可用性好处。通过使用丢弃 _
表示 return 值未使用
嗯。视情况而定。
(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) 的代码。据我所知,编译器非常聪明。
在那个例子中,看反汇编代码和我一样,所以真的没有区别。
在 C# 中使用丢弃有任何性能优势吗?在 Visual Studio 2019 年,编辑建议对未使用 returned 值的 return 类型方法使用丢弃。
据我所知,使用丢弃物几乎没有什么好处。它与未分配的变量相同,因此减少内存使用量是一个好处。好处有多大,不得而知。 Visual Studio 也一直建议我使用丢弃,但我只是从弹出窗口中抑制了该消息。
根据MSDN
Discards which are temporary, dummy variables that are intentionally unused in application code. Discards are equivalent to unassigned variables; they do not have a value. Because there is only a single discard variable, and that variable may not even be allocated storage, discards can reduce memory allocations.
如您所见,您可以减少内存使用量,因为它们可能未被分配。但确切的行为取决于代码的上下文。
丢弃的主要用例是元组,switch
表达式中的模式匹配
switch (obj)
{
case SomeType someTypeValue:
...
break;
case null:
...
break;
case object _:
...
break;
}
具有 out
个参数的方法
if (int.TryParse(s, out _))
{
}
并根据需要忽略方法 _ = Task.Run(() => {...});
中的 return 值。
在干净的代码方面也有很大的可用性好处。通过使用丢弃 _
表示 return 值未使用
嗯。视情况而定。
(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) 的代码。据我所知,编译器非常聪明。
在那个例子中,看反汇编代码和我一样,所以真的没有区别。