【问题标题】:Discards inside C# Linq queries在 C# Linq 查询中丢弃
【发布时间】:2019-04-25 06:56:40
【问题描述】:

我想知道根据https://docs.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);

【问题讨论】:

    标签: c# linq c#-7.0


    【解决方案1】:

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

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

    您可以判断它不是丢弃,因为它的值 没有被丢弃 - 您在 lambda 表达式的其余部分中使用它。当您正在使用该值时,我强烈不鼓励使用_ 作为 lambda 表达式参数名称。当您想要丢弃它时,可以使用_ 作为参数名称,即使从语言的角度来看它在技术上不是丢弃。之所以选择 _ 这个名字作为废弃,正是因为它已经在实践中使用了。

    【讨论】:

    • 我们可以说丢弃在 linq/lambdas 中不可用吗? 支持的上下文很广泛。但是还有语句“当范围内没有_ 时独立的_。如果可以使用局部变量_,那么如何丢弃它?
    • @Sinatr:这意味着直接分配给_,而不是将其声明为局部变量。例如,_ = 5; 没有 _ 否则在范围内是丢弃。 int _= 5; 是一个常规的局部变量声明。但是丢弃可以在 LINQ 中使用 - 例如,您可以使用 .Where(text => int.TryParse(text, out _)) 过滤掉无法解析为整数的字符串。
    【解决方案2】:

    这些下划线只是命名为 _ 的 lambda 参数,就像它们在 C# 6 中所做的那样。它们不是丢弃物。

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

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

    • out 变量声明,如bool found = TryGetValue(out var _)bool 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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 如果未赋值,编译器在使用时会报错。但是,在这种情况下,无论如何它都不是丢弃物。提供的代码在 C# 的早期版本中有效,并且具有相同的含义。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-04
      • 1970-01-01
      • 2018-11-13
      相关资源
      最近更新 更多