从面向对象的观点来看,最好总是使用具体的类型和接口来解决问题。然而,通常这并不容易做到。在数据库中,查询可能会给出与任何层次结构都无关的不同对象类型。访问API服务时,可以返回一个列表或对象,或者可能什么也不返回。因此,方法通常应该与不同的类型一起工作。这就是模式匹配可以提供帮助的地方。
例如,下面创建了一个不同对象的数组。在这个名为data的数组中,第一个元素是null,其后是值为42的整数、一个字符串、一个Person类型的对象,以及一个包含Person对象的数组:
static void Main(string[] args)
{
var p1 = new Person{FirstName = "Katharina",LastName = "Nagel"};
var p2 = new Person{FirstName = "Matthias",LastName = "Nagel"};
var p3 = new Person{FirstName = "Stephanie",LastName = "Nagel"};
object[] data = {null,42,"astring",p1,new Person[]{p2,p3}};
foreach(var item in data)
{
IsOperator(item);
}
foreach(var item in data)
{
switchStatament(item);
}
}
在C# 7中的模式匹配中,is运算符和switch语句得到了三种模式的增强:const模式、type模式和var模式。下面从is运算符开始详细介绍。
模式匹配与is运算符
与is运算符的简单匹配是const模式。在这个模式中,可以将对象与常量值进行比较,比如null或42:
static void IsOperator(object item)
{
//const pattern
if(item is null)
{
System.Console.WriteLine("