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

文 | 罗奇奇

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

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

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

41499db07f4a46be07c905e7f2915204.png

内插字符串(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 预览:列表模式

7f184ca8805bf166bdbbab4ebd8874af.png

新的 列表模式 允许将数组或列表与一系列模式匹配,例如 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 预览:新的参数空值检查

9b61dbbfe55396d149a9164192b4c348.png

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)进行讨论。

d2164ab8bff82f936e7c7aec1225bd95.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290946.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css 中图片旋转,倾斜,位移,平滑

在开发中&#xff0c;我们常常需要对图片有一些绚丽的效果&#xff0c;比如是图片旋转&#xff0c;平移&#xff0c;倾斜等。其实这些在css3中都已经存在&#xff0c;整理下作为demo&#xff0c;以后参考使用&#xff0c;也希望供大家交流学习。如果不足&#xff0c;多多指导。…

java程序

This XML file does not appear to have any style information associated with it. The document tree is shown below.博客园_首页代码改变世界uuid:5de59c50-a92f-4447-96ed-ab86451ed183;id61182014-07-27T11:59:08Zfeed.cnblogs.comhttp://www.cnblogs.com/jianyus/p/386…

android 网卡监听,Android实时监听网络的变化

4中情况。1.无网 2.wifi 3.移动信号 4.网线BroadcastReceiver netReceiver new BroadcastReceiver(){Overridepublic void onReceive(Context context, Intent intent) {String action intent.getAction();if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {Con…

深入理解加密、解密、数字签名(签名证书、加密证书)的组成和数字证书

深入理解加密、解密、数字签名和数字证书 随着电子商务的迅速发展&#xff0c;信息安全已成为焦点问题之一&#xff0c;尤其是网上支付和网络银行对信息安全的要求显得更为突出。为了能在因特网上开展安全的电子商务活动&#xff0c;公开密钥基础设施&#xff08; PKI, Public …

使用Blazor做个简单的时间戳在线转换工具

时间戳转换时间戳转换&#xff0c;关键点在于双向绑定bind-Value&#xff0c;就简单贴源码吧TimestampTool.razorpage "/timestamp" using BlazorComponent.I18n layout PublicLayout<PageTitle>T("TimestampToolTitle")</PageTitle><h2 st…

转载:Pixhawk源码笔记一:APM代码基本结构

转自 新浪微博WalkAnt 基础知识 详细参考&#xff1a;http://dev.ardupilot.com/wiki/learning-the-ardupilot-codebase/ 第一部分&#xff1a;介绍 详细参考&#xff1a;http://dev.ardupilot.com/wiki/learning-ardupilot-introduction/ ArduPilot 代码分为5个主要部分&…

html页面阴影怎么做,html – 做弯曲阴影的最佳方式

您将使用伪元素和box-shadow属性来执行此操作.我在这里为你做了一个例子&#xff1a;http://jsfiddle.net/joshnh/NWnXw/这在IE9及以上工作./* Shadow */.shadow {box-shadow: 0 1px 5px hsla(0,0%,0%,.25),inset 0 0 50px hsla(0,0%,0%,.05);position: relative;}.shadow:afte…

nginx+tomcat8+memcached实现session共享具体操作

本次试验用到的软件包的版本如下&#xff1a;一、针对10.43.2.134的操作1.安装jdk环境tar zxf jdk-8u5-linux-x64.tar.gz mkdir /usr/javamv jdk1.8.0_05/ /usr/java/编辑/etc/profile在文档的末尾追加如下5行内容&#xff1a;JAVA_HOME/usr/java/jdk1.8.0_05JRE_HOME/usr/java…

Android之解决Base64 encode中文乱码问题

1、问题 需求需要&#xff0c;把字符串转化为UTF-8编码之后需要base64.encode处理&#xff0c;但是我写了 String ss new String(value.getbytes("UTF-8"), "UTF-8");Base64.encode(ss); 死活出不来&#xff0c;依然乱码&#xff0c;然后写了检测当前编码…

.NET6之MiniAPI(十九):NLog

在本系例文章的第八篇中&#xff0c;我们聊过官方的日志实现&#xff0c;即《.NET6之MiniAPI(八)&#xff1a;日志》。但官方的日志功能更多是提供了一个实现基础&#xff0c;对于要求一个灵活&#xff0c;强大&#xff0c;方便的日志体系&#xff0c;官方的还是有差距的&#…

mysql-proxy

yum -y install mysql-proxy#mysql-proxy?--daemon?--log-leveldebug?--log-file/var/log/mysql-proxy.log?-P?10.254.157.xxx:3310(本机内网IP,端口自己随意设置)?--proxy-backend-addresses10.137.192.xxx:3306&#xff08;rds内网IP&#xff09; 您看下这几个步骤 是…

字符串倒序

#include "stdafx.h" #include <stdio.h>#include "t11.h" #include <string.h> #include <stdlib.h>//以下代码是把一个字符串倒序 int t11() {char* src "1234567890";int len strlen(src);char* dest (char*)malloc(len…

html地区三级联下拉列表,JS-三级联下拉列表

/p>var types"家电,服饰,家具,日用";var types_str1"电视机,洗衣机,电冰箱,空调|外套,衬衣,大衣,裤子|书桌,书柜,饭桌,衣柜|清洁,洗发,纸品,厨房";var types_str2"索尼,海信,康佳,飞利浦^海尔,LG,三星^海尔,飞利浦,韩电^格力,美的,海尔,长虹"…

Android ndk之Check that/ndk/openssl/crypto/libsfk.so exists or that its path is corret

1、问题 编译ndk里面的子模块的时候出现这个错误 Android ndk Check that/ndk/openssl/crypto/libsfk.so exists or that its path is corret 2、解决办法 是因为编译模块依赖libsfk.so这个文件&#xff0c;所以把这个文件拷贝到这个编译的模块就可以执行 ndk-build succe…

完美:C# Blazor中显示Markdown并添加代码高亮

昨天发了一篇介绍这个库&#xff1a;C# Blazor中显示Markdown文件&#xff0c;介绍怎么在Blazor中显示Markdown内容的文章&#xff0c;文章内的代码是没有高亮的&#xff0c;思来相去&#xff0c;还是要做好&#xff0c;于是百度到这篇文章.NET C# Blazor 服务端渲染Markdown&a…

微服务架构成功之路

本文来源于我在InfoQ中文站翻译的文章&#xff0c;原文地址是&#xff1a;http://www.infoq.com/cn/news/2015/07/success-of-microservices近年来&#xff0c;在软件开发领域关于微服务的讨论呈现出火爆的局面&#xff0c;有人倾向于在系统设计与开发中採用微服务方式实现软件…

读《一个程序猿的生命周期》有感

《一个程序猿的生命周期》中的作者来自贫困家庭&#xff0c;可以说是一个从大山里走出来的人。他深知&#xff0c;只有刻苦学习才能改变现状&#xff0c;所以他学习非常努力。 但人生总不是这样一帆风顺的&#xff0c;总会在我们的人生路上给与我们一些打击。意想不到的事情发生…

ymPrompt

ymPrompt消息提示组件4.0 组件调用方式1(传统参数传入方式)&#xff1a;示例调用方法 ymPrompt.alert(http://www.qq.com,null,null,确认要提交吗?,handler) ymPrompt.succeedInfo(document.getElementById(txt).innerHTML,400,260,null,handler2) ymPrompt.errorInfo(操作失败…

html点击关闭代码,怎样开放和关闭html代码?

如何使ASP输出结果不支持html语法&#xff1f;整理编辑&#xff1a;China ASP网友aspboy1原创有时候我们会为这样一个问题而烦恼,就是如何在asp页面中避免支持html语法.例如: 下面一句话"这是一个表单语句"当我们在ASP文件中用response.write"这是一个表单语句&…

linux之如何复制文件夹所有文件到其它文件夹

1、复制文件夹所有文件到其他文件夹 比如复制文件夹test1里面的所有文件到文件夹test2里面去,test1和test2都在同一个路径下面 cd test1cp * ../test2/ 如果是复制文件夹里面的所有内容到另外一个文件夹 cp -rf Android/* ../../chenyu/ 2、如果解决一开始运行项目没问题&…