C# 模式匹配
文章目录
- 前言
- 一、is模式
- 二、switch语句中的模式
- 三、解构模式
- 四、总结
前言
在 C# 中,模式匹配是一种强大的技术,它允许你在代码中更简洁、更安全地检查和处理对象的类型和值。本教程将介绍 C# 中的模式匹配功能,包括is模式、switch语句中的模式以及解构模式。
一、is模式
is模式用于检查对象是否为特定类型,并在匹配成功时将其转换为该类型。以下是一个示例:
object obj = "Hello, World!";
if (obj is string str)
{
Console.WriteLine(str.Length);
}
在这个例子中,我们使用is模式检查obj是否为string类型。如果是,将其转换为string类型并存储在str变量中。然后,我们可以使用str变量进行进一步的操作。
is模式还可以与逻辑运算符结合使用,以进行更复杂的类型检查。例如:
object obj = new List<int>();
if (obj is List<int> list && list.Count > 0)
{
Console.WriteLine(list[0]);
}
在这个例子中,我们首先检查obj是否为List类型。如果是,并且列表不为空,我们可以访问列表的第一个元素。
二、switch语句中的模式
C# 7.0 引入了在switch语句中使用模式的功能。这使得switch语句更加灵活和强大。以下是一个示例:
object obj = "Hello";
switch (obj)
{
case string str:
Console.WriteLine(str.Length);
break;
case int i:
Console.WriteLine(i * 2);
break;
default:
Console.WriteLine("Unknown type");
break;
}
在这个例子中,我们使用switch语句根据obj的类型进行不同的操作。如果obj是string类型,我们将其转换为string类型并打印其长度。如果obj是int类型,我们将其乘以 2 并打印结果。如果obj不是任何已知类型,我们打印 “Unknown type”。
switch语句中的模式还可以使用关系运算符和常量值进行匹配。例如:
int num = 5;
switch (num)
{
case > 10:
Console.WriteLine("Greater than 10");
break;
case < 0:
Console.WriteLine("Less than 0");
break;
case 0:
case 5:
Console.WriteLine("Special value");
break;
default:
Console.WriteLine("Other value");
break;
}
在这个例子中,我们使用关系运算符和常量值在switch语句中进行匹配。如果num大于 10,我们打印 “Greater than 10”。如果num小于 0,我们打印 “Less than 0”。如果num等于 0 或 5,我们打印 “Special value”。如果num不是以上任何值,我们打印 “Other value”。
三、解构模式
解构模式允许你将一个对象或元组分解为多个变量。以下是一个示例:
var point = (X: 10, Y: 20);
var (x, y) = point;
Console.WriteLine($"X: {x}, Y: {y}");
在这个例子中,我们定义了一个元组point,然后使用解构模式将其分解为x和y两个变量。这样,我们可以更方便地访问元组中的各个元素。
解构模式也可以用于自定义类型。以下是一个示例:
class Point
{
public int X { get; set; }
public int Y { get; set; }
public void Deconstruct(out int x, out int y)
{
x = X;
y = Y;
}
}
var point = new Point { X = 10, Y = 20 };
var (x, y) = point;
Console.WriteLine($"X: {x}, Y: {y}");
在这个例子中,我们定义了一个自定义类型Point,并实现了Deconstruct方法。这样,我们就可以使用解构模式将Point对象分解为x和y两个变量。
四、总结
C# 中的模式匹配功能提供了一种更简洁、更安全的方式来处理对象的类型和值。通过is模式、switch语句中的模式以及解构模式,你可以在代码中更轻松地进行类型检查和对象操作。这些功能使得 C# 代码更加可读、可维护,并提高了开发效率。