代码之家  ›  专栏  ›  技术社区  ›  J. Doe

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

  •  -5
  • J. Doe  · 技术社区  · 7 年前

    我一直在读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 回复  |  直到 7 年前
        1
  •  0
  •   Jon Skeet    7 年前

    “s”是什么意思?

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

    你的例子很不幸 Console.WriteLine 接受 object 也。。。但假设你想打印出字符串的长度。这里有一个完整的例子 没有 模式匹配:

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

    它不仅更长,而且有效地执行了两次相同的检查:一次用于 is 接线员,一次给演员模式匹配通过将字符串的值作为 操作员:

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