C#的逻辑模式组合是模式匹配体系中的重要组成部分,通过and、or、not三个关键字,可以将多个基础模式组合成更复杂的匹配条件,避免编写冗长的条件判断代码,让逻辑表达更清晰直观。

逻辑模式基础概念
逻辑模式允许开发者对多个模式进行逻辑运算,其中and表示所有模式都满足才匹配成功,or表示任意一个模式满足就匹配成功,not表示对当前模式的结果取反。这些模式可以和类型模式、常量模式、关系模式等基础模式结合使用,大幅扩展模式匹配的适用范围。
and模式的使用方法
and模式用于组合多个需要满足的条件,所有子模式都匹配时整体才匹配。最常见的场景是对数值范围进行判断,比如判断一个数是否在指定区间内。
// 判断数值是否在10到20之间(包含边界)
int num = 15;
if (num is >= 10 and <= 20)
{
Console.WriteLine("数值在10到20之间");
}
// 在switch表达式中使用and模式
string GetScoreLevel(int score) => score switch
{
>= 90 and <= 100 => "优秀",
>= 60 and < 90 => "及格",
>= 0 and < 60 => "不及格",
_ => "无效分数"
};
上述代码中,>=10 and <=20就是and模式的典型用法,同时判断数值大于等于10且小于等于20两个条件,比传统的num >=10 && num <=20写法更贴合模式匹配的风格。
or模式的使用方法
or模式只要任意一个子模式匹配就判定整体匹配,适合处理多个可选条件的场景,比如判断输入值是否属于某一组可选值。
// 判断字符是否为元音字母
char c = 'e';
if (c is 'a' or 'e' or 'i' or 'o' or 'u')
{
Console.WriteLine("字符是元音字母");
}
// 结合类型模式使用or
object obj = "test";
if (obj is int or string)
{
Console.WriteLine("对象是int类型或者string类型");
}
or模式也可以和类型模式组合,比如上述代码中判断对象是否为int或者string类型,比使用obj is int || obj is string的写法更简洁。
not模式的使用方法
not模式用于对匹配结果取反,适合排除特定条件的场景,比如判断值不属于某个范围或者某个类型。
// 判断数值不在1到10之间
int value = 15;
if (value is not (>= 1 and <= 10))
{
Console.WriteLine("数值不在1到10之间");
}
// 判断对象不是null
object data = new object();
if (data is not null)
{
Console.WriteLine("对象不为空");
}
not模式还可以和括号结合使用,比如not (>=1 and <=10)表示不满足大于等于1且小于等于10的条件,逻辑表达非常直观。
逻辑模式的组合使用
三种逻辑模式可以互相嵌套组合,实现更复杂的匹配逻辑,比如同时判断类型和范围条件。
// 判断对象是否为int类型且在1到100之间,或者是string类型且长度大于5
object input = 50;
if (input is (int and >= 1 and <= 100) or (string s and s.Length > 5))
{
Console.WriteLine("匹配成功");
}
上述代码中,先通过括号分组,第一组判断是否为int类型且在1到100之间,第二组判断是否为string类型且长度大于5,两组之间用or连接,实现了多条件的灵活组合。
使用注意事项
- 逻辑模式的优先级从高到低为not、and、or,不确定优先级时建议用括号明确分组,避免逻辑错误。
- and模式的所有子模式都会被执行匹配,or模式在第一个匹配成功的子模式后就会停止后续匹配,和逻辑运算符的短路特性一致。
- 逻辑模式只能用于模式匹配的上下文,不能直接替代传统的逻辑运算符
&&、||、!使用。
常见问题解答
逻辑模式支持哪些C#版本?
and、or、not逻辑模式从C# 9.0开始引入,使用这些特性需要确保项目的C#语言版本不低于9.0。
逻辑模式可以和属性模式组合吗?
可以,比如判断一个对象的某个属性满足多个条件:person is { Age: >= 18 and < 60 },表示判断person对象的Age属性在18到60之间。