带有空检查的 C# 7 switch case
Posted
技术标签:
【中文标题】带有空检查的 C# 7 switch case【英文标题】:C# 7 switch case with null checks 【发布时间】:2017-08-14 12:27:36 【问题描述】:C#7 引入了一个名为 patterns 的新功能,您可以将其与 Is-Expression 或 Switch 案例一起使用,如下所示:
string str = null;
switch(str)
case string x:
Console.WriteLine("string " + x);
break;
default:
Console.WriteLine("default");
break;
你会认为它会进入案例#1,因为它是相同的类型,但它没有。
【问题讨论】:
“因为它是同一类型” - 不是真的。如果你这样做object o = str; bool isString = o is string;
那么isString
将是错误的......
是的,正确,空字符串不引用 System.String 对象
@JonSkeet,如果您在下面看到我的回答并查看它,我将不胜感激。
Patrick 的回答绝对是一个更好的 IMO。
【参考方案1】:
不管你怎么想,string x = null
实际上根本不是一个字符串。它是“无”,分配给字符串类型的变量。
你的switch里的check基本和null is string
一样,早就是false
了。这是使用泛型评估类型时的常见问题,但它也有其优点。
在后台,is
使用 as
,并带有一个空检查。所以这就是为什么它不能返回真。您可以说is
运算符的逻辑如下:
is = (null as string) != null
【讨论】:
谢谢@patrick-hofman 还有如果我没有提供一个空案例的概念。这是正确的吗? 是的。这是唯一的选择。【参考方案2】:其实它们不是因为字符串上的空值。
这个想法是 switch 在 c#7 中带有模式的案例在评估案例时添加了另一个用于 Null 检查的案例,如果您没有添加 Null 案例检查,它将转到 default 大小写,所以最好在使用这个新功能时添加一个空大小写,或者如果你知道默认值会做什么,则将其保留为默认值。
希望对你有帮助!
【讨论】:
不,这不是它背后的想法。问题就是 .NET 在底层是如何工作的。请参阅我的回答,其中解释了这种模式是如何实现的。以上是关于带有空检查的 C# 7 switch case的主要内容,如果未能解决你的问题,请参考以下文章
使用 switch-case 检查 Number / NaN 类型 [重复]
GCC 4.4:避免在 gcc 中对 switch/case 语句进行范围检查?
java检查char是不是是switch case语句中的数字[关闭]