C# 11 都有哪些新特性?
时间:2022-03-04 17:25 来源:linux.it.net.cn 作者:IT
.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 存储库进行讨论。
(责任编辑:IT)
.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 存储库进行讨论。 (责任编辑:IT) |