为了账号安全,请及时绑定邮箱和手机立即绑定

在 C# Linq 查询中丢弃

在 C# Linq 查询中丢弃

C#
函数式编程 2022-12-31 09:42:04
我想知道根据https://learn.microsoft.com/en-us/dotnet/csharp/discards在 Linq 查询中使用 Discards 是否是好的模式,例如:public bool HasRedProduct => Products.Any(_=>_.IsRed == true);什么是优点/缺点而不是使用public bool HasRedProduct => Products.Any(x=>x.IsRed == true);
查看完整描述

3 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

这不是丢弃 - 它是一个名为 的 lambda 表达式参数_。落入文章后面的注释:

请注意,这_也是一个有效的标识符。当在受支持的上下文之外使用时,_不被视为丢弃,而是被视为有效变量。

你可以说它不是丢弃,因为它的值没有被丢弃——你在 lambda 表达式的其余部分使用它。当您使用该值时,我强烈反对将_用作 lambda 表达式参数名称。当你想丢弃它时,它可以用作参数名称,即使从语言的角度来看它在技术上不是丢弃。为丢弃物选择这个名称正是因为它已经在实践中使用了。__


查看完整回答
反对 回复 2022-12-31
?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

这些下划线只是命名_为 C# 6 中的 lambda 参数。它们不是丢弃项。

在某些新上下文(例如,变量声明)和一些现有上下文(例如,赋值_ = expression;)中丢弃 C# 7 中引入的位置。在后一种情况下,下划线的 C#6 解释(如果存在)胜出,以尊重向后兼容性。

丢弃是可以分配给但不能读取的变量。他们没有名字。相反,它们由“_”(下划线)表示。在 C#7.0 中,它们可以出现在以下上下文中:

  • out 变量声明,例如bool found = TryGetValue(out var _)orbool found = TryGetValue(out _)

  • 解构作业,例如(x, _) = deconstructable;

  • 解构声明,例如(var x, var _) = deconstructable;

  • 是模式,例如x is int _

  • 开关/案例模式,例如case int _:

丢弃物的主要表示形式是_声明表达式中的(下划线)标记。例如,int _在 out 变量声明或var (_, _, x)解构声明中。

丢弃的第二种表示是使用表达式_作为 的简写var _,当命名_的变量不在范围内时。输出变量、解构赋值和声明以及普通赋值 ( _ = IgnoredReturn();) 中都允许使用它。但是,在 C#7.0 模式中不允许这样做。当命名的变量_确实存在于作用域中时,表达式_只是对该变量的引用,就像它在早期版本的 C# 中所做的那样。

https://github.com/dotnet/roslyn/blob/master/docs/features/discards.md


查看完整回答
反对 回复 2022-12-31
?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

丢弃,它们是临时的虚拟变量,有意在应用程序代码中不使用。Discards相当于未赋值的变量;他们没有价值。因为只有一个丢弃变量,而且该变量甚至可能没有分配存储空间,所以丢弃可以减少内存分配。因为它们使您的代码的意图清晰,所以它们增强了代码的可读性和可维护性。

这意味着这些变量不会在您的代码中使用,并且按照编写的那样,它们没有价值。所以你的查询应该抛出空引用异常(因为那_是未分配的


查看完整回答
反对 回复 2022-12-31
  • 3 回答
  • 0 关注
  • 119 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信