发布于 2026-01-05 6 阅读
0

由 Mux 主办的 C# 9.0 DEV 全球展示挑战赛:展示你的项目!

C# 9.0 的梦想

由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!

作为2019 年 C# Advent 系列的最后一篇文章Calvin Allen谈到了 C# 9 语言中一些令他最为兴奋的提案。这是一篇篇幅短小、文笔流畅且引人入胜的文章,值得一读。本文将对此进行更详细的阐述。

请便,我等着。

太好了!既然你回来了,我们就来聊聊 C# 9 中让我非常兴奋的几个方面,因为它支持更多函数式编程技术。

好了,说完这些前言,C# 9 究竟有哪些地方让我如此兴奋呢?

注意:此处所有内容均为提案,语法和是否会纳入下一版 C# 仍未最终确定。不过,展望未来总是有益的。有关提案的完整详情,请参阅GitHub 上的 C# 9 里程碑项目

简化的空值验证

我们先从简单的事情开始。

C# 9 的提案允许使用以下语法:

注意旁边的感叹号brain

这段代码等效于:

如您所见,此功能将简化参数验证,并有可能通过 IntelliSense 使上游调用者能够看到参数验证。

我对这个功能的初步想法是,我很喜欢它,而且很可能会用到它,但我更倾向于使用C# 8 现有的空值验证机制。将两者结合起来当然可以,但主要是为了提高代码的可读性和文档质量。

不过,这项功能有助于对遗留的 C# 代码库进行检测。

主要构造者

C# 9 提出了一些提案,允许您以与 TypeScript 相同的方式简化类构造函数。

而不是编写以下代码:

您也可以使用以下代码:

如你所见,代码量明显减少。我常说,不必编写的代码就不会出错,而这正是其中一个例子。

通过精简构造函数逻辑,您可以消除冗余的样板代码,避免开发者仅仅浏览代码文件而忽略真正的代码审查。代码量越少,代码就越有意义,也就越难隐藏 bug。

顺便一提,这是我喜欢 F# 的原因之一,所以我很高兴看到任何有助于 C# 达到类似简洁水平的东西。

记录类别

记录与主构造函数非常相似,我几乎可以说它们是主构造函数的语法微调变体。

假设你需要一个能够存储一定量信息,但不需要任何方法的对象。这本质上就是一条记录或一段数据。

您可以使用主构造函数来声明对象的字段,然后在类定义末尾添加分号,而不是声明一个空的构造函数体:

一般来说,我不赞成在面向对象编程中使用记录类,除非它们适用于像 F# 这样的极简函数式编程语言。

正如我们在最近发布的 C# 版本中所看到的,该语言正在支持越来越多的函数式编程方面,我认为这一特性是启用和扩展更高级特性(如可区分联合)的垫脚石。

通过枚举类对工会进行歧视

我对 C# 语言最迫切的愿望就是支持可区分联合类型和多种类型的匹配。顺便一提,正如我之前写过的,这也是我在 F# 中最喜欢的特性

如果你不熟悉可区分联合类型,它表示一个对象可以是 X 种不同的可能性之一,你的代码可以根据这些可能性进行匹配,并根据对象的类型采取适当的操作。

C# 目前通过继承和重载在一定程度上支持这种行为,但适当的可区分联合体简洁明了,并且不需要面向对象特性即可工作。


C# 9 有一个功能提案,旨在支持语言中的歧视性工会。

请查看以下类定义,注意enum class语法的使用以及记录和主构造函数的使用:

然后,您可以通过类似以下的 switch 表达式,在代码中匹配游戏卡:

需要指出的是,在我讨论过的所有特性中,这可能是目前最不稳定的一个。关于它应该如何运作,以及它是否应该存在于该语言中,目前有很多不同的想法。

我个人认为它应该存在。我之前曾使用过像 OneOf 这样的库来尝试在 C# 中使用可区分联合类型,但正如我在之前的文章中提到的,我对该库的某些方面感到失望。

支持 C# 中的歧视性联合,您将会看到更多可能性涌现,这些可能性提供了函数式编程和面向对象编程之间的混合,以及 F# 和 C# 之间更好的集成。

结语

正如我之前提到的,C# 显然正在朝着支持更多函数式编程技术的方向发展——对于那些想要使用这些技术的人来说。

这种趋势可能会让一些人感到恼火,但 .NET 和 C# 语言在过去几十年中的适应能力是我喜欢这门语言和框架的关键原因之一,正如我今年早些时候写的那样

再次强调,这些特性并不能保证会在 C# 9 中实现,也未必是最终版本。随着 C# 9 发布日期的临近,我们将持续关注这些特性的开发进展。

再次感谢我的朋友 Calvin Allen,他C# Advent 系列博客文章中重点介绍了这些技术。

我期待看到这些特性随着时间的推移会发生怎样的变化,以及 C# 9 将会带来哪些全面革新。

这篇文章《C# 9.0 的梦想》最初发表于Kill All Defects网站。

文章来源:https://dev.to/integerman/the-dream-of-c-9-0-5fc7