C# 11 都有哪些新特性?


.NET 首席项目经理凯瑟琳在博客中介绍了 C# 11 的一些预览性新功能,这些功能可以在 Visual Studio 17.1 和 .NET SDK 6.0.200 中体验,下面摘录一部分新特性作介绍:

C# 11 预览:允许在内插字符串的“插值表达式”中换行

内插字符串(interpolated strings)是 C# 6.0 引入的语法,它允许在字符串中插入表达式。C# 的内插字符串分为非逐字和逐字内插字符串(分别是 $"" 和 $@"")两种。两者最大的区别是:非逐字内插字符串与普通字符串一样,不能在字符串文本中包含换行符,必须使用转义符(如\r \n)。相反,逐字插值字符串可以在其文本段中包含换行符,并且不会转义换行符或其他字符。

但是,非逐字插值字符串中的“换行符限制”,从字符串文本扩散到了文本之外的 插值表达式 ,这导致了很多不必要的限制。比如在 C# 11 之前,下面这段代码编译起来会报错:

var v = $"Count is\t: { this.Is.A.Really()
.That.I.Should(
be + able)[
to.Wrap()] }.";

但在 C# 11 预览版中,它是合法的,可以正常编译。

关于该新特性的详细讨论可查看 GitHub Issue #4935。 

C# 11 预览:列表模式

新的 列表模式 允许将数组或列表与一系列模式匹配,例如 array is [1, 2, 3] 将匹配长度为 3 的整数数组,其元素分别为 1、2、3。除了允许匹配列表和数组,还可以匹配元素,且可以选择包含零个或多个元素的切片模式。使用切片模式可以丢弃或捕获零个或多个元素。

列表模式的语法是用方括号括起来的值,切片模式的语法是两个点 ..。切片模式后面可以跟着另一个列表模式,比如 var 模式来捕获切片内容。

比如,该模式匹配以下所有内容:[1, 2, .., 10]

int[] arr1 = { 1, 2, 10 };
int[] arr1 = { 1, 2, 5, 10 };
int[] arr1 = { 1, 2, 5, 6, 7, 8, 9, 10 };

要探索列表模式,请参考:

public static int CheckSwitch(int[] values)
=> values switch
{
[1, 2, .., 10] => 1,
[1, 2] => 2,
[1, _] => 3,
[1, ..] => 4,
[..] => 50
};

当它传递以下数组时,结果如下所示:

WriteLine(CheckSwitch(new[] { 1, 2, 10 }));// prints 1
WriteLine(CheckSwitch(new[] { 1, 2, 7, 3, 3, 10 })); // prints 1
WriteLine(CheckSwitch(new[] { 1, 2 }));// prints 2
WriteLine(CheckSwitch(new[] { 1, 3 }));// prints 3
WriteLine(CheckSwitch(new[] { 1, 3, 5 })); // prints 4
WriteLine(CheckSwitch(new[] { 2, 5, 6, 7 }));// prints 50

还可以捕获切片模式的结果:

public static string CaptureSlice(int[] values)
=> values switch
{
[1, .. var middle, _] => $"Middle {String.Join(", ", middle)}",
[.. var all] => $"All {String.Join(", ", all)}"
};
  • 列表模式适用于任何可计数和可索引的类型 —— 这意味着它有一个可访问的 Length 或 Count 属性,以及一个带 int 或 System.Index 形参的索引器。
  • 切片模式适用于任何可计数和可切片的类型 —— 这意味着它有一个以 Range 为实参的可访问索引器,或者具有两个 int 形参的可访问 Slice 方法。
  • 目前正在考虑在 IEnumerable 类型上添加对列表模式的支持,点此查看关于该列表模式的详细介绍。

C# 11 预览:新的参数空值检查

C# 11 提供了一种简化的语法,用于验证方法的参数不是 null ,以及正确抛出 ArgumentNullException

以前可以使用样板代码的变体来验证方法参数是否为空:

public static void M(string s)
{
if (s is null)
{
throw new ArgumentNullException(nameof(s));
}
// Body of the method
}

使用新的参数 null 检查,可以通过添加 !! 到参数名,自动执行空值检查:

public static void M(string s!!)
{
// Body of the method
}

自动生成的空值检查代码将在方法主体的代码之前执行。对于构造器,该空值检查发生在字段初始化、调用 base 构造函数和调用 this 构造函数之前。

有关该新的参数空值检查,可在此查看详细介绍。

如何尝试预览特性

若要尝试 C# 11的预览特性,请创建一个 C# 项目,并将  LangVersion 设置为 preview,.csproj 文件配置如下:

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<LangVersion>preview</LangVersion>
</PropertyGroup>
</Project>

有关 C# 11 的更多详细内容,请查看博客原文,或通过 GitHub 上的 CSharpLang 存储库进行讨论。


相關推薦

2022-12-14

在当今的一些大型科技公司,如 Twitter、Crunchbase 或 Github 都有应用。 Jobs Found: 125K (~5%) Keywords: ruby, ruby on rails 8、GO Go 是谷歌在 12 年前创建的一种年轻语言。谷歌设计 Go 是为了在多核、联网机器和大型代码库时

2022-07-01

较模糊的工作。 让我们一起看看在目前的市场需求中,哪些语言是最紧俏的。 8. GO Go 是一门年轻的语言,Google 于 12 年前才创建它。Google 设计 Go 是为了在多核、联网机器和大型代码库的时代提高编程效率。从下面的图表中

2021-12-17

组件库 主流的Bootstrap, Ant Design, Material Design等双方都有。但由于现代前端多年的积累,质量上的确有一定差距。 除了丰富程度上,Blazor允许被JavaScript调用加载,并生成Angualr、React等组件。 虽然这看起来跟用C#解决代替

2023-07-20

在当今的一些大型科技公司,如 Twitter、Crunchbase 或 Github 都有应用。 8、GO Go 是谷歌在 12 年前创建的一种年轻语言。谷歌设计 Go 是为了在多核、联网机器和大型代码库时代提高编程效率。如下图所示,Go 的受欢迎程度正在

2022-11-09

到整个功能实现的所有内容。这真的是每个人的 C#。” 新版本中的一些亮点更新内容包括: UTF-8 字符串(UTF-8 String Literals) 默认情况下,C# 字符串被硬编码为 UTF-16,而 Internet 上通行的字符串编码是 UTF-8。为了最大限度地减

2023-10-10

排行榜。 C# 和 Java 之间的差距越来越小,达到了历史新低,目前两者的差距仅为 1.2%。TIOBE CEO Paul Jansen 认为,如果这一趋势继续保持,那么 C# 将在两个月后超过 Java。 在所有编程语言中,Java 的跌幅最大,为 -3.92%;C#

2023-02-11

到开发者使用 C# 的领域的多样性,微软将重点关注语言特性和性能改进,使所有或大多数开发者受益,并保持对向后兼容性的高度承诺。他们将继续支持更广泛的 .NET 生态,并扩大其在 C# 未来的作用,同时保持对设计决策的管

2023-08-05

nbsp;.NET 6.0.2。 具体更新内容如下: New Language Features C# 11 校验运算符 C# 11 无符号右移操作符 C# 11 UTF8 字符串字面量 C# 11 numeric IntPtr C# 11 ref 字段和作用域 mcs 2.6.4 pinned regions 更新了 Roslyn 4.6.0 的模式检测功能 Contrib

2022-08-29

本,让我们可以提前预览到 VirtualBox 下一个大版本中到底都有哪些值得关注的新功能,其中一个就是正式支持 Windows 11,以及 macOS Big Sur 和 macOS Monterey. VirtualBox 7 的主要改进之一就是支持更多操作系统,以 Windows 为例,其实用

2023-11-29

/yhuse SunnyUI.Net 是基于.Net Framework 4.0~4.8、.Net 6 框架的 C# WinForm 开源控件库、工具类库、扩展类库、多页面开发框架。 此版本更新内容为: + 增加 * 修改 - 删除 2023-11-28 V3.6.1 + UISymbolPanel:增加图标编辑器面板 * UIFontIma

2023-06-08

套件 —— C# Dev Kit,通过更好地管理、测试,以及提供全新的 AI 功能,为 Linux、macOS 和 Windows 平台的开发者带来了更好的 C# 开发体验。 根据微软官方提供的信息,C# Dev Kit 从 Visual Studio 中借用了一些开发者们熟悉的概念,并

2022-06-17

微软项目经理 Tim Heuer 公布了 VSCode C# 扩展的路线图更新,新的路线图引入语言服务器协议(LSP) 作为 VSCode C# 扩展的基础通信机制,并计划创建一个新的“LSP Tools Host”组件作为新版 C# 扩展的基础,以引入更多实用功能。

2023-11-23

/yhuse SunnyUI.Net 是基于.Net Framework 4.0~4.8、.Net 6 框架的 C# WinForm 开源控件库、工具类库、扩展类库、多页面开发框架。 此版本更新内容为: + 增加 * 修改 - 删除 2023-11-21 V3.6.0 注意:大版本更新,重构主题 建议新项目

2022-11-20

改的好时机。 如果要升级 C 语言标准到 C99,那就要考虑哪些 C99 特性可以改进像 curl 这样的项目。Daniel 表示自己能想到的可能给 curl 代码带来积极影响的部分特性是: //注释 __func__预定义标识符 在<stdbool.h>中使用布