在C#中,匹配模式通常指的是使用模式匹配(Pattern Matching)功能来检查一个对象是否符合特定的结构,并从中提取所需的信息。C# 7.0及更高版本引入了几个新的特性来支持模式匹配,主要包括:
-
switch表达式
-
is表达式
-
when子句
-
属性模式
-
元组模式
-
var模式
-
常量模式
-
声明模式
-
递归模式
-
关系模式
1. 使用is
表达式进行类型检查和模式匹配
is
表达式可以用来检查一个对象是否为特定类型,并同时将该对象转换为该类型。
object obj = "Hello, World!";
if (obj is string text)
{
Console.WriteLine(text.ToUpper()); // 输出: HELLO, WORLD!
}
else
{
Console.WriteLine("Not a string");
}
2. 使用switch
表达式进行模式匹配
C# 7.0引入了switch
表达式,使得在switch
语句中可以使用模式匹配。
object obj = "Hello, World!";
switch (obj)
{
case string s when s.StartsWith("Hello"):
Console.WriteLine($"Starts with 'Hello': {s}");
break;
case int i:
Console.WriteLine($"It's an integer: {i}");
break;
default:
Console.WriteLine("Not matched");
break;
}
3. 元组模式匹配
元组模式匹配允许你检查元组中的元素。
(int, string) tuple = (1, "Hello");
if (tuple is (int id, string message) && id > 0)
{
Console.WriteLine($"ID: {id}, Message: {message}");
}
4. 属性模式匹配(C# 8.0及以后)
属性模式允许你直接匹配对象的属性值。
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
Person person = new Person { Name = "Alice", Age = 30 };
if (person is { Name: "Alice", Age: > 25 })
{
Console.WriteLine("Name is Alice and Age is greater than 25.");
}
5. 递归模式(C# 8.0及以后)
递归模式允许你在嵌套结构中使用模式匹配。例如,匹配一个树结构。
record Tree(string Value, Tree? Left, Tree? Right);
var tree = new Tree("Root", new Tree("Left", null, null), new Tree("Right", null, null));
if (tree is { Left: { Value: "Left" }, Right: { Value: "Right" } })
{
Console.WriteLine("Tree matches the pattern.");
}
通过这些特性,C#的模式匹配功能非常强大,可以用于多种场景,包括但不限于类型检查、数据提取和条件逻辑处理。