C# 11 预览,又增加了实用的语法糖
文 | 罗奇奇
出品 | 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 预览,又增加了实用的语法糖相关推荐
- Windows 11 预览版泄露!有 macOS 那味儿了......
整理 | 郑丽媛 出品 | CSDN(ID:CSDNnews) 两周前,我们还在就下一代 Windows 的名称争论不休: "Windows 10 党"认为:下一代 Wind ...
- Windows 11 预览版 Build 22000.168 发布
微软现已发布第八个 Windows 11 预览版更新 KB5005191,版本号升级至 Build 22000.168. 本次更新面向 Beta 频道和 Dev 频道的 Windows 预览体验成员推 ...
- Windows 11 预览版 Build 22000.120 发布
微软现已发布第五个 Windows 11 预览版更新 KB5005188,版本号升级至 Build 22000.120. 本次更新面向 Dev 频道和 Beta 频道的 Windows 预览体验成员推 ...
- Win 11 预览版虚拟机安装
虚拟机版本:15.5 pro 操作系统:win 11 预览版 安装 首先我们创建新的虚拟机 ------------------------------------ 然而自己在网上找了好几个激活码都没 ...
- Windows 11 预览版镜像提前出世!附下载
Win11,一夜全网曝光! 国内平台昨晚有开发者泄露了微软全新的 Windows 11 英文预览版.由此可证实 Windows 11 确实是官方命名,虽然没什么太大变化.根据微软发布规律,它将于今年晚 ...
- 不买新电脑不能升级Win 11 ?旧版PC被踢出Win 11预览计划
Microsoft 开始删除 Windows Insider 测试计划中不符合升级条件的PC.如果用户一直使用不满足最低硬件要求的机器测试 Windows 11,可能会看到Windows 更新中的消息 ...
- Visual Studio 2017 15.6版本预览,增加新功能
上周Visual Studio 2017 15.5 版本已正式发布,同时发布的还有 Visual Studio for Mac 7.3 . Visual Studio 2017 15.6 版本预览,这 ...
- 完美解决PC电脑0x0和0x800BFA07等错误,成功加入Windows10/11预览体验计划
很多人在加入Windows预览体验计划时,出现错误,无法加入,错误代码包括:0x0和0x800BFA07等等.尝试更换网络.修改DNS.修改注册表和重新注册Microsoft微软账号等方法,都无法解决 ...
- Windows 11 预览版来了?
最近,在一些文章看到,win11预览版来了,还有预览视频. 不过,遗憾的是,经过小编的一番论证,这是假的. B站17年就有这种视频了,只不过是个ppt而已~ 不过微软要放弃win7的更新维护倒是真的. ...
最新文章
- 容斥原理学习(Hdu 4135,Hdu 1796)
- 只需2.5W功耗,就能达到5TOPS算力!地平线新一代AIoT芯片「旭日3」发布
- php目录间拷贝文件方法
- 类和对象—对象特性—构造函数调用规则
- Java 集合 之 房屋出租实例
- mysql中binlog_format模式与配置详解
- SpringBoot集成FastDFS依赖实现文件上传
- mysql master or master copy
- 计算机2020中级考试题,突发!2020年中级考试分值及评分标准大变!
- Git学习总结(25)——Git 常用的分支开发模式及规范总结
- Knative 带来的极致 Serverless 体验
- 数据库系统实现 第一章 DBMS实现概述
- rdd和DF数据存入MYSQL
- 老大,我想获取MySQL插入数据的自增ID,该怎么弄?
- ecplise反编译插件
- linux环境下hadoop版本的升级、更换
- vm虚拟机搭建click house(单机)
- 请求参数为null问题
- 传苹果将采用:夏普IGZO技术面板量产
- BMZCTF:insomniteaser_2019_l33t_hoster