21CTO导读:标志有“unsafe”关键字将承担更多繁重的工作,而联合类型则统一不同形式的数据。
微软最近发布了 C# 15 的预览版。这一版本对数据类型引入了更严格的限制,并增强了内存安全保护。此次版本更新中最受开发者期待的功能或许就是联合类型了。
联合类型在编程中并不新鲜。
Python、Scala 和 TypeScript 都支持这个概念。但对于 C# 来说另有新奇,“联合类型就应该是这样的,”C# 首席设计师Mads Torgersen在 今年早些时候的一次介绍性演讲中自豪地说。
简而言之,C# 联合类型提供了一种将不同的自定义数据类型归类到单个实体中的方法。
union 关键字可以将一组自定义数据类型(例如“狗”、“猫”和“鸟”)合并为一个单一的伞形类型,例如“宠物”。union 关键字为编译器提供了一个明确的“宠物”列表,该列表不能被扩展。
public record class Cat(string Name);public record class Dog(string Name);public record class Bird(string Name);public union Pet(Cat, Dog, Bird);Pet pet = new Dog("Rex");string name = pet switch{Dog d => d.Name,Cat c => c.Name,Bird b => b.Name, // omit one arm and the compiler complains};
微软文档里这样解释道:“联合体能够实现传统层次结构无法表达的设计,将现有类型的任意组合组合成一个单一的、经过编译器验证的契约。”
对开发者而言,其优势包括更好的模式匹配、为联合类型编写自定义函数的能力、防止恶意数据类型、更强大的抽象以及更少的样板错误代码编写。
在演讲中,Torgersen 与微软首席工程师Dustin Campbell一起演示了联合体如何合并两个不同的记录,以指定网络上输入流的成功或失败。
他们提出了两种不同的记录类型:一种使用整数表示成功,另一种是标准的文本错误消息。通过使用 union 关键字将它们组合起来,他们创建了一个单独的 switch 表达式来解析结果。
如果没有这个快捷方式,他们就必须在 switch 语句中添加错误消息来处理未知输入,创建一个包装器(这将占用更多内存,而且可能更容易出现错误),或者部署第三方库来解析结果。
虽然联合类型中允许的数据类型受到限制,但 C# 15 的另一项新特性——封闭层次结构——为继承的派生类型提供了类似的控制。基类使用 `closed` 关键字将直接继承严格限制在同一程序集中定义的派生类型。封闭层次结构会阻止编译第三方子类型,否则很可能会导致错误。
最初,带有“unsafe”标记的代码块只是提醒编译器它可能会以不安全的方式与内存交互。
微软产品经理理查德·兰德 (Richard Lander)在 今年早些时候的一篇博客文章中写道:
现在,该关键字的作用范围已扩大到“告知调用者他们有义务履行这些义务以维护安全”。扩展后的关键字作用域将使编译器能够标记不安全的操作。
Lander 写道,此举效仿了 Rust 和 Swift 的做法。在 Rust 和 Swift 中,关键字遵循“更严格、面向传播的语义”。
C# 15 的其他新特性包括“集合表达式参数”,它允许开发者使用 with 关键字,将参数(例如容量或比较器)直接传递给集合表达式语法中底层集合的构造函数。
现在,开发者可以在扩展块中声明索引器,还可以向 break 和 continue 语句添加标签,以便通过嵌套循环进行更精细的控制。
值得注意的是,即使微软的重心已从销售 Windows 和 Office 许可证转向销售云订阅服务,并将人工智能助手 Copilot 推向各个角落,但 C# 依然屹立不倒。
C# 最初由 Anders Hejlsberg创建,微软于 2002 年首次发布 ,作为 Java 的替代方案,可在当时微软新推出的 Windows 平台 .NET 上运行。C# 后来开创了编程语言的诸多新功能,例如异步同步功能,以及用于查询数据库和其他数据源的LINQ 接口。
时光荏苒,岁月如歌。二十多年过去了,微软仍在定期更新 C# 语言。要体验 C# 15,请大家下载.NET 11预览版。
作者:场长
参考:
https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-15
本篇文章为 @ 场长 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 微信公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。
请扫描二维码,使用微信支付哦。