C#的模式匹配功能允许开发者在条件判断时直接对对象的类型、值、结构等信息进行匹配,is和switch是实现模式匹配最常用的两个关键字,它们分别对应不同的使用场景,能够大幅减少冗余的类型转换和判断代码。

is模式匹配的基础用法
传统的is关键字仅用于判断对象是否为指定类型,返回布尔值,而C#的模式匹配扩展了is的能力,支持在判断的同时完成类型转换和变量声明,语法格式为变量 is 类型 变量名,如果匹配成功,声明的变量会直接赋值为转换后的结果,无需额外进行强制转换。
下面是一个基础的类型匹配示例,判断输入对象是否为整数类型并直接使用匹配到的值:
using System;
class Program
{
static void Main()
{
object input = 123;
// 使用is模式匹配判断是否为int类型,同时声明变量num接收转换后的值
if (input is int num)
{
Console.WriteLine($"输入是整数,值为:{num}");
}
else
{
Console.WriteLine("输入不是整数");
}
}
}
is模式匹配还支持常量匹配、关系匹配等场景,比如判断数值是否在特定范围内:
int score = 85;
// 判断分数是否在60到100之间
if (score is >= 60 and <= 100)
{
Console.WriteLine("分数合格");
}
switch模式匹配的基础用法
switch的模式匹配是对传统switch语句的扩展,传统switch仅支持常量匹配,而模式匹配的switch支持类型匹配、属性匹配、元组匹配等多种匹配方式,语法格式为switch (表达式) { case 模式: 执行逻辑; break; },还支持使用when关键字添加额外的匹配条件。
下面是一个类型匹配的switch示例,根据输入对象的类型执行不同的逻辑:
using System;
class Program
{
static void PrintInfo(object input)
{
switch (input)
{
// 匹配string类型,声明变量s接收值
case string s:
Console.WriteLine($"输入是字符串,长度为:{s.Length}");
break;
// 匹配int类型,且值大于0
case int n when n > 0:
Console.WriteLine($"输入是正整数,值为:{n}");
break;
// 匹配int类型,且值小于等于0
case int n:
Console.WriteLine($"输入是非正整数,值为:{n}");
break;
// 匹配其他所有情况
default:
Console.WriteLine("输入是其他类型");
break;
}
}
static void Main()
{
PrintInfo("hello");
PrintInfo(10);
PrintInfo(-5);
PrintInfo(3.14);
}
}
switch模式匹配还支持元组匹配,适合同时判断多个变量的场景:
(int x, int y) point = (2, 3);
switch (point)
{
case (0, 0):
Console.WriteLine("原点");
break;
case (var a, 0):
Console.WriteLine($"在X轴上,X值为:{a}");
break;
case (0, var b):
Console.WriteLine($"在Y轴上,Y值为:{b}");
break;
default:
Console.WriteLine($"普通点,坐标为({point.x}, {point.y})");
break;
}
is和switch模式匹配的差异与选择
is模式匹配更适合单个条件的判断场景,语法更简洁,不需要写多个case分支,而switch模式匹配更适合多分支的条件匹配场景,能够集中处理多种不同的匹配情况,代码结构更清晰。
两者的核心差异对比如下:
| 对比维度 | is模式匹配 | switch模式匹配 |
|---|---|---|
| 适用场景 | 单个条件判断 | 多分支条件匹配 |
| 语法复杂度 | 低,适合简单判断 | 稍高,适合复杂多分支 |
| 额外条件支持 | 需结合逻辑运算符 | 原生支持when关键字 |
| 返回值处理 | 仅返回布尔值,变量需单独声明 | 可在case中直接处理匹配结果 |
在实际开发中,如果是判断单个条件是否符合预期,优先选择is模式匹配,代码更简洁;如果是需要根据不同的匹配情况执行不同的逻辑,优先选择switch模式匹配,代码的可维护性更高。