<p>答案是.NET中的模式匹配通过类型模式、switch表达式和属性模式简化类型判断与分支逻辑。它从C# 7.0开始引入,支持在is表达式中直接声明变量,避免强制转换;C# 8提供switch表达式,使用=>返回结果,结合when过滤条件,提升代码简洁性与可读性;属性模式则按对象结构匹配,如根据Person的Age和Name属性值分类,减少冗余if-else,增强维护性。</p>

.NET中的模式匹配是一种语言特性,允许你以更简洁、更具表达力的方式检查对象的类型和结构,并根据这些条件执行不同的逻辑。它从C# 7.0开始引入,并在后续版本中不断增强。相比传统的 if-else 和 switch 判断,模式匹配能显著减少冗余代码,提升可读性和维护性。
传统写法中,我们常这样判断类型并转换:
if (obj is string) {
string s = (string)obj;
Console.WriteLine($"字符串长度:{s.Length}");
}
else if (obj is int) {
int i = (int)obj;
Console.WriteLine($"整数值的两倍:{i * 2}");
}
使用类型模式,可以直接在 is 表达式中声明变量:
if (obj is string s) {
Console.WriteLine($"字符串长度:{s.Length}");
}
else if (obj is int i) {
Console.WriteLine($"整数值的两倍:{i * 2}");
}
变量 s 和 i 只在对应的代码块中有效,避免了强制转换和作用域混乱。
C# 8 引入了 switch 表达式,支持模式匹配,语法更紧凑,返回值也更清晰。
比如处理不同类型的对象:
var result = obj switch
{
null => "空值",
string s when s.Length == 0 => "空字符串",
string s => $"字符串:{s}, 长度 {s.Length}",
int i when i < 0 => $"负整数:{i}",
int i => $"正整数或零:{i}",
_ => "未知类型"
};
特点:
当需要根据对象的属性值做判断时,属性模式非常有用。
例如有这样一个类:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
你可以这样匹配:
var person = new Person { Name = "Alice", Age = 25 };
<p>var category = person switch
{
{ Age: < 13 } => "儿童",
{ Age: >= 13 and <= 19 } => "青少年",
{ Age: > 19 } and { Name: "Admin" } => "成年管理员",
{ Age: > 19 } => "成年人",
_ => "未知"
};</p>这里 { Age: 就是属性模式,直接解构属性进行比较。
对于支持解构的对象(如元组、记录类型),可以按位置匹配。
(string name, int age) = ("Bob", 30);
<p>var desc = (name, age) switch
{
("Alice", 25) => "特定用户",
(<em>, 0) => "年龄为0",
(var n, var a) when a > 18 => $"成人:{n}",
</em> => "其他"
};</p>记录类型(record)天然支持位置解构,非常适合模式匹配。
基本上就这些。用好模式匹配,可以让原本冗长的条件判断变得清晰又优雅,特别适合处理多种输入类型或复杂业务规则的场景。不复杂但容易忽略。
以上就是.NET中的模式匹配(Pattern Matching)是什么?如何用它简化复杂的if-else和switch?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号