C#11新特性预览

共 2614字,需浏览 6分钟

 ·

2022-03-12 20:30


    2020年2月随着.NET 7 Preview 1的发布,Visual Studio 17.1(Visual Studio 2022 Update 1)和.NET SDK 6.0.200已经包含C# 11的预览功能!可以更新 Visual Studio 或下载最新的 .NET SDK 以获取这些功能。


C#11有那些新功能呢?下面简单介绍一下


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

C# 支持两种样式的内插字符串:逐字和非逐字内插字符串。它们之间的主要区别在于,非逐字内插字符串不能在其文本段中包含换行符,而必须改用转义(如 \r\n)。逐字内插字符串可以在其文本段中包含换行符,并且不转义换行符或其他字符(""除外,用于转义引号本身)。

而C#11允许在内插字符串的“插值表达式”中换行,如下示例:

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


以上情况将导致 C# 10 中的编译器错误,在 C# 11 预览版中是合法的。


2、C# 11 预览:列表模式

   新的列表模式允许您与列表和数组进行匹配。您可以匹配元素,也可以选择包括与零个或多个元素匹配的切片图案。使用切片模式,可以丢弃或捕获零个或多个元素。

 列表模式的语法是用方括号括起来的值,切片模式的语法是两个点 ..。切片模式后面可以跟着另一个列表模式,比如 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 1WriteLine(CheckSwitch(new[] { 1, 2, 7, 3, 3, 10 })); // prints 1WriteLine(CheckSwitch(new[] { 1, 2 }));              // prints 2WriteLine(CheckSwitch(new[] { 1, 3 }));              // prints 3WriteLine(CheckSwitch(new[] { 1, 3, 5 }));           // prints 4WriteLine(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)}"    };

列表模式适用于任何可数和可编制索引的类型,这意味着它具有可访问的或属性,而索引器具有 or 参数。切片模式适用于任何可数和可切片的类型,这意味着它具有将 a 作为参数的可访问索引器,或者具有具有两个参数的可访问方法。

目前正在考虑在 IEnumerable 类型上添加对列表模式的支持,点此查看关于该列表模式的详细介绍。


3、 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 构造函数之前。


总结

Visual Studio 17.1 和 .NET SDK 6.0.200 提供了对 C# 11 的早期版本。您可以使用参数空值检查、列表模式和内插字符串有关该新的参数空值检查等。请下载相关SDK体验吧!


出处:https://devblogs.microsoft.com/dotnet/category/csharp/


支持小微:


299元购买5000+的.NET架构课程,还送初级中级课程!

腾讯云 爆款2核2G云服务器首年40,2G4核云服务器298元/3年

链接:https://curl.qcloud.com/1VVs7OBH


右下角,您点一下在看图片c46b68f710bfe97b297eb4a3ed82f36c.webp

小微工资涨1毛

商务合作QQ:185601686



浏览 41
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报