Microsoft 公布了 C# 15 预览版中的新功能,该版本将随 .NET 11 推出。此次更新包括联合类型、封闭层次结构,以及用于处理不安全代码的更新模型预览版,同时还包含一些较小的变化,旨在减少日常使用中重复的程序性代码。
集合表达式中的参数
C# 中的集合表达式可以将值转换为多种集合类型,但此前无法向基础构造函数或创建函数传递参数。C# 15 新增了一个形式为 with(...) 的元素,放置在表达式开头,用于传递这些参数。
例如,可以直接在表达式中创建列表并指定容量,或创建 HashSet 并传入 StringComparer.OrdinalIgnoreCase,而不必将创建对象与添加元素分开。Microsoft 表示,这项能力为构建即将推出的字典表达式语法奠定了基础,因为后者很可能需要指定用于键的比较器。
通过扩展索引访问元素
在 C# 14 除了方法之外新增属性和运算符扩展成员后,C# 15 将这一模型扩展到了扩展索引。因此,可以像访问某个接收对象类型中原本定义的索引一样访问该对象中的元素。
在 Microsoft 展示的示例中,访问 IEnumerable<int> 中的元素需要使用类似 ElementAtIndex 的辅助方法。而新语法允许通过与接收对象关联的扩展索引使用 numbers[2]。博客说明,索引不能是静态的,因此扩展容器必须包含一个命名的接收对象。
为 break 和 continue 循环添加标签
C# 15 允许为迭代循环命名,然后直接将 break 或 continue 指向这些循环。这在嵌套循环中很有用,因为此前要退出外层循环通常需要使用布尔变量、goto,或将逻辑移到单独的函数中。
实际上,命名可以使代码中的退出目标更加明确,并消除用于跟踪是否找到所需元素的变量。示例展示了一个名为 scan 的循环,可以直接使用 break scan 退出。
对开发者而言有哪些变化?
这些功能与其说改变了 .NET 的运行模型,不如说是重新组织了代码语法,并减少了一些重复模板。它们的价值尤其体现在使用集合表达式、处理嵌套循环,或需要为可扩展类型提供更简洁访问接口的项目中。
不过,这些功能仍处于预览阶段,因此尚不代表最终稳定的接口。Microsoft 邀请开发者下载 .NET 11,在自己的应用中试用 C# 15,同时查阅完整的新功能参考,并参与 csharplang 项目中的持续讨论。本文来源没有说明这些功能转为稳定版本的最终日期。