C#7.0的模式匹配中的变量有什么意义?

时间:2018-07-29 18:13:31

标签: c# pattern-matching

我一直在阅读有关C#7.0中“ is”运算符模式匹配的信息,但没有看到变量声明的原因。

如果有这个

if(str is string s)
   Console.WriteLine(s);

“ s”的意义是什么?
this post中说,此类变量的重点不是两次访问被评估对象。但是没有意义!
如果这是true,则意味着str只是一个字符串对象,并且两次访问Console.WriteLine都没有太大的意义。无论如何,其内容都将复制到s访问,这肯定会花费与str一样多的时间。

我要问的是-为什么在访问评估的变量时在C#7.0的模式匹配功能中声明变量应该与复制变量然后访问其副本的操作大致相同?

1 个答案:

答案 0 :(得分:0)

  

“ s”的意义是什么?

这是您刚刚检查过的类型的变量,您经常要使用它。

您的示例是一个不幸的示例,因为Console.WriteLine也接受object ...但是,假设您想打印出字符串的长度。这是一个完整的示例,没有模式匹配:

public void PrintLengthIfString(object obj)
{
    if (obj is string)
    {
        string str = (string) obj;
        Console.WriteLine(str.Length);
    }
}

不仅时间更长,而且可以有效地执行两次相同的检查:一次用于is运算符,一次用于强制转换。通过将字符串的值作为is运算符的一部分,模式匹配使此过程变得更加简单:

public void PrintLengthIfString(object obj)
{
    if (obj is string str)
    {
        // No cast here, it's in the pattern match!
        Console.WriteLine(str.Length);
    }
}