在C#7中使用Var模式

时间:2017-08-23 16:04:40

标签: c# pattern-matching

我在新的C#7

中看到了var模式的这个例子
if (o is var x) Console.WriteLine($"it's a var pattern with the type {x?.GetType()?.Name}");

只是使用有什么不同:

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

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

2 个答案:

答案 0 :(得分:21)

在这个例子中没有实际的区别。很遗憾,很多网站都使用它 - 甚至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只是一种风格选择。但是,有两种情况需要varanonymous types或者您想要允许空值。后者是因为null与任何类型都不匹配。

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

答案 1 :(得分:1)

正如here提出的问题InBetween,解释了var pattern的一个用法是何时使用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在答案中说。