我一直在阅读有关C#7.0中“ is”运算符模式匹配的信息,但没有看到变量声明的原因。
如果有这个
if(str is string s)
Console.WriteLine(s);
“ s”的意义是什么?
在this post中说,此类变量的重点不是两次访问被评估对象。但是没有意义!
如果这是true
,则意味着str
只是一个字符串对象,并且两次访问Console.WriteLine
都没有太大的意义。无论如何,其内容都将复制到s
访问,这肯定会花费与str
一样多的时间。
我要问的是-为什么在访问评估的变量时在C#7.0的模式匹配功能中声明变量应该与复制变量然后访问其副本的操作大致相同?
答案 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);
}
}