在本次章节的前半部分,我们探讨了单个对象如何支持针对其类型和属性的模式匹配。这种模式匹配的概念同样适用于数组和集合类型的数据结构。
在C 11中,引入了列表模式匹配,这一特性适用于任何具有公共Length或Count属性,并且使用int或System.Index参数的索引器的类型。这为开发者提供了更加强大和灵活的编程能力,能够在不同的数据结构之间进行统一的模式匹配。
当在同一个switch表达式中定义多个列表模式时,必须按照特定顺序排列,更具体的模式要放在更一般的模式之前,否则编译器会因为模式匹配的优先级问题而报错。
表3.3展示了列表模式匹配的示例,假设有一个int值列表的情况。通过这个表格,我们可以更直观地理解列表模式匹配的具体应用。
接下来,让我们看一些代码示例。在Program.cs文件的底部,添加语句以定义一些int值的数组,然后将它们传递给一个方法。该方法根据最佳匹配的模式返回描述性文本。
在C中,微软添加了对表达式主体函数成员的支持,这在上文的CheckSwitch函数中已经有所体现。使用=>字符指示函数的返回值。这种语法极大地简化了函数的编写过程。
运行代码后,你将注意到结果如预期所示。在switch表达式中,最后一个项目后的尾随逗号是可选的,编译器不会对此提出异议。
关于允许switch表达式的尾随逗号的讨论,可以在指定的GitHub链接中找到详细的讨论记录。同样,JSON序列化器也采用了这种选项,因为其使用如此普遍,具体讨论参见提供的链接。
对于数组和集合的使用,虽然数组在临时存储多个项目时非常有用,但集合提供了更灵活的选项,尤其在动态添加和删除项目时。我们将在第8章“使用常见.NET类型”中详细讨论集合的相关内容。
关于数组和其它数据类型之间的转换,也称为类型转换或隐式/显式转换。其中隐式转换是自动发生的,且通常是安全的。而显式转换则需要手动执行,因为它可能会丢失信息。例如,将一个int变量转换为double变量是安全的隐式转换,而将double变量转换为int变量则需要显式地进行,并注意可能的数据丢失。
当处理大整数和小整数之间的值转换时,我们必须格外小心。任何过大的值在转换时都可能发生信息丢失或回绕等意外情况。这涉及到整数的二进制表示以及如何处理整数的溢出问题。我们将在本章后面看到更多关于整数溢出的例子以及如何处理它。
关于类型转换中的舍入规则,C采用了银行家舍入法来减少偏差。然而其他语言如JavaScript则采用小学规则。通过使用Math类的Round方法,我们可以控制舍入规则。对于每种编程语言,都应该检查其舍入规则以确保它们按预期工作。
最后提到了将任何对象隐式地转换为string以进行输出的情况。实际上在编程中经常需要进行这种转换以便于输出为人类可读的文本。不同的类型有其自己的ToString方法来实现这一转换。