文 | 罗奇奇

出品 | OSC开源社区(ID:oschina2013)

.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(https://github.com/dotnet/csharplang/issues/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 类型上添加对列表模式的支持,点此查看(https://github.com/dotnet/csharplang/blob/main/proposals/list-patterns.md)关于该列表模式的详细介绍。

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

有关该新的参数空值检查,可在此查看(https://github.com/dotnet/csharplang/blob/main/proposals/param-nullchecking.md)详细介绍。

如何尝试预览特性

若要尝试 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 存储库(https://github.com/dotnet/csharplang/discussions)进行讨论。

C# 11 预览,又增加了实用的语法糖相关推荐

  1. Windows 11 预览版泄露!有 macOS 那味儿了......

    ‍‍ 整理 | 郑丽媛 出品 | CSDN(ID:CSDNnews) 两周前,我们还在就下一代 Windows 的名称争论不休: "Windows 10 党"认为:下一代 Wind ...

  2. Windows 11 预览版 Build 22000.168 发布

    微软现已发布第八个 Windows 11 预览版更新 KB5005191,版本号升级至 Build 22000.168. 本次更新面向 Beta 频道和 Dev 频道的 Windows 预览体验成员推 ...

  3. Windows 11 预览版 Build 22000.120 发布

    微软现已发布第五个 Windows 11 预览版更新 KB5005188,版本号升级至 Build 22000.120. 本次更新面向 Dev 频道和 Beta 频道的 Windows 预览体验成员推 ...

  4. Win 11 预览版虚拟机安装

    虚拟机版本:15.5 pro 操作系统:win 11 预览版 安装 首先我们创建新的虚拟机 ------------------------------------ 然而自己在网上找了好几个激活码都没 ...

  5. Windows 11 预览版镜像提前出世!附下载

    Win11,一夜全网曝光! 国内平台昨晚有开发者泄露了微软全新的 Windows 11 英文预览版.由此可证实 Windows 11 确实是官方命名,虽然没什么太大变化.根据微软发布规律,它将于今年晚 ...

  6. 不买新电脑不能升级Win 11 ?旧版PC被踢出Win 11预览计划

    Microsoft 开始删除 Windows Insider 测试计划中不符合升级条件的PC.如果用户一直使用不满足最低硬件要求的机器测试 Windows 11,可能会看到Windows 更新中的消息 ...

  7. Visual Studio 2017 15.6版本预览,增加新功能

    上周Visual Studio 2017 15.5 版本已正式发布,同时发布的还有 Visual Studio for Mac 7.3 . Visual Studio 2017 15.6 版本预览,这 ...

  8. 完美解决PC电脑0x0和0x800BFA07等错误,成功加入Windows10/11预览体验计划

    很多人在加入Windows预览体验计划时,出现错误,无法加入,错误代码包括:0x0和0x800BFA07等等.尝试更换网络.修改DNS.修改注册表和重新注册Microsoft微软账号等方法,都无法解决 ...

  9. Windows 11 预览版来了?

    最近,在一些文章看到,win11预览版来了,还有预览视频. 不过,遗憾的是,经过小编的一番论证,这是假的. B站17年就有这种视频了,只不过是个ppt而已~ 不过微软要放弃win7的更新维护倒是真的. ...

最新文章

  1. 容斥原理学习(Hdu 4135,Hdu 1796)
  2. 只需2.5W功耗,就能达到5TOPS算力!地平线新一代AIoT芯片「旭日3」发布
  3. php目录间拷贝文件方法
  4. 类和对象—对象特性—构造函数调用规则
  5. Java 集合 之 房屋出租实例
  6. mysql中binlog_format模式与配置详解
  7. SpringBoot集成FastDFS依赖实现文件上传
  8. mysql master or master copy
  9. 计算机2020中级考试题,突发!2020年中级考试分值及评分标准大变!
  10. Git学习总结(25)——Git 常用的分支开发模式及规范总结
  11. Knative 带来的极致 Serverless 体验
  12. 数据库系统实现 第一章 DBMS实现概述
  13. rdd和DF数据存入MYSQL
  14. 老大,我想获取MySQL插入数据的自增ID,该怎么弄?
  15. ecplise反编译插件
  16. linux环境下hadoop版本的升级、更换
  17. vm虚拟机搭建click house(单机)
  18. 请求参数为null问题
  19. 传苹果将采用:夏普IGZO技术面板量产
  20. BMZCTF:insomniteaser_2019_l33t_hoster

热门文章

  1. 论文的写作要求、流程与写作技巧
  2. JVM 类型的生命周期学习
  3. spring mvc 入门配置
  4. 一起谈.NET技术,异步调用与多线程的区别
  5. ISA Server服务器故障恢复一例系统盘符更换之后的应对方法
  6. MySql优化 (2009-08-28 系统架构师大会) 演讲ppt
  7. androidsdk里的android.bat和uiautomatorview.bat启动就闪退问题
  8. 关于IE 对 $.get 缓存的记录
  9. JDBC学习笔记之JDBC简介
  10. Git 常用命令(二)