代码检查:源表达式始终匹配提供的模式
在下面的示例中, case string myStr 看起来像是类型检查,但实际上执行了两件事:
检查
str是否是System.String的实例。检查
str是否不是null。
但根据方法签名, str 始终是 System.String 的实例,因此 case string myStr 的唯一目的就是检查 str 是否是 null。
这就是为什么 ReSharper 通知您匹配表达式中使用的类型模式未显示代码的真实语义,而只是 一个空值检查。
对于 模式匹配表达式中的空值检查,C# 8 引入了一种 对象模式 ,其语法如下: { }。 此模式旨在匹配除 null 值以外的所有内容,并在 快速修复中建议使用。
void Test(string str)
{
switch (str)
{
case string myStr:
// use myStr
break;
}
}
void Test(string str)
{
switch (str)
{
case { } myStr:
// use myStr
break;
}
}
当表达式的类型未更改时,使用对象模式代替类型模式具有以下优势:
阅读代码的每个人都会看到这只是一个空值检查。
如果您在初始示例中重构代码并将
str参数的类型更改为object,例如,代码将继续编译,但会执行类型检查,您可能不会注意到,直到在运行时看到代码行为的变化。 另一方面,{ } myStr始终会执行空值检查,并且无论str的类型如何,行为都类似。
最后修改日期: 2025年 9月 27日