【问题标题】:Usage of Var Pattern in C# 7C# 7 中 Var 模式的使用
【发布时间】:2018-02-01 07:56:36
【问题描述】:

我在新的 C# 7 中看到了这个 var 模式的示例

if (o is var x) Console.WriteLine($"it's a var pattern with the type {x?.GetType()?.Name}");

just use有什么不同:

var x = o;
Console.WriteLine($"it's a var pattern with the type {x?.GetType()?.Name}");

当这种模式是一个有用的解决方案时。

【问题讨论】:

  • 不同的是一个是有条件的WriteLine,另一个不是。
  • 我正在尝试考虑这种模式的有用用法(我看不到),或者如果它是语言故障。另一种可能性是 var 实际上可能是一种类型,尽管那会很可怕。
  • @GeorgeStocker 我不明白如果条件始终为真,我为什么要使用 if 语句。

标签: c# pattern-matching


【解决方案1】:

正如InBetween 提出的问题here,解释了var 模式的一种用法是何时使用switch 语句,如下所示:

string s = null;
var collection = new string[] { "abb", "abd", "abc", null};
switch (s)
{
    case "xyz":
        Console.WriteLine("Is xyz");
        break;

    case var ss when (collection).Contains(s):
        Console.WriteLine("Is in list");
        break;

    default:
        Console.WriteLine("Failed!");
        break;

}

AS Aydin Adn 在他的回答中说。

【讨论】:

    【解决方案2】:

    在该示例中没有实际区别。不幸的是,有这么多网站使用它——甚至是the language reference

    如果您需要一个布尔表达式中的临时变量,您将使用x is var y 模式的主要原因。例如:

    allLists.Where(list => list.Count() is var count && count >= min && count <= max)
    

    通过创建临时变量count,我们可以多次使用它,而无需每次调用​​Count() 的性能成本。

    在那个例子中,我们可以改用is int count——var 只是一种风格选择。但是,有两种情况需要var:对于anonymous types 或者如果您想允许空值。后者是因为null 不匹配任何类型。

    不过,对于if,您可以做同样的事情:if (list.Count() is var count &amp;&amp; count &gt;= min &amp;&amp; count &lt;= max)。但这显然很愚蠢。普遍的共识似乎是在if 中没有什么用处。但是语言不会阻止你,因为从特定的表达形式中禁止这种特定的表达形式会使语言复杂化。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多