模式匹配功能增强
C# 9.0中引入了新的模式匹配改进,包括类型模式,括号模式,连词和模式,或者模式,否定模式和关系模式。本文将对这些新特性进行详细介绍,并提供相应示例。
# 类型模式
类型模式用于匹配对象是否为特定类型。语法为 type varName
,其中 varName
是将要创建的变量名。如果对象是特定类型的实例,将会创建这个变量并且执行相应的代码块。如果不是,则不会执行。
例如,我们可以使用以下代码块来检查一个变量是否为字符串类型:
object obj = "Hello, world!";
if (obj is string str)
{
Console.WriteLine(str.ToUpper());
}
这里,如果 obj
是一个字符串类型,那么 str
将会被赋值为这个字符串,并且执行大写化字符串的代码块。
# 括号模式
括号模式用于强制或强调模式组合的优先级。括号中的模式将首先被匹配。例如,我们可以使用以下代码块来检查一个对象是否为字符串类型,或者整数类型并且值为偶数:
object obj = 4;
if (obj is (int i) && i % 2 == 0 || obj is string str)
{
Console.WriteLine("Matching pattern!");
}
在这个示例中,我们使用了括号模式来确保整数模式与值为偶数的限定符结合得更紧密。如果对象是整数类型并且值为偶数,或者是字符串类型,那么代码块将会被执行。
# 连词和模式
连词和模式要求两个模式都匹配。语法为 and
。例如,我们可以使用以下代码块来检查一个对象是否为整数类型并且值大于10:
object obj = 12;
if (obj is int i and > 10)
{
Console.WriteLine($"The number is {i}.");
}
在这个示例中,我们使用了连词和模式来确保对象既是整数类型,而且值大于10。如果对象是整数类型并且值大于10,那么代码块将会被执行。
# 或者模式
或者模式要求两个模式中至少有一个匹配。语法为 or
。例如,我们可以使用以下代码块来检查一个对象是否为字符串类型或者整数类型:
object obj = "Hello, world!";
if (obj is string or int)
{
Console.WriteLine("Matching pattern!");
}
在这个示例中,我们使用了或者模式来确保对象是字符串类型或整数类型。如果对象是字符串类型或整数类型,那么代码块将会被执行。
# 否定模式
否定模式要求模式不匹配。语法为 not
。例如,我们可以使用以下代码块来检查一个对象是否不是字符串类型:
object obj = 4;
if (obj is not string)
{
Console.WriteLine("Matching pattern!");
}
在这个示例中,我们使用了否定模式来确保对象不是字符串类型。如果对象不是字符串类型,那么代码块将会被执行。
# 关系模式
关系模式要求输入小于、大于、小于等于或大于等于给定的常量。语法为 <
, >
, <=
或 >=
。例如,我们可以使用以下代码块来检查一个整数是否小于等于10:
int num = 7;
if (num is <= 10)
{
Console.WriteLine("Matching pattern!");
}
在这个示例中,我们使用了关系模式来确保整数不超过10。如果整数不超过10,那么代码块将会被执行。
# 结论
C# 9.0的模式匹配增强使得我们能够更加方便地进行对象匹配,并且可以使用更复杂的模式进行匹配。使用这些新特性,我们可以编写更加简洁和易读的代码,并且可以更加清晰地表达我们的意图。