C#11新特性整理
假期中有时间,整理了C#11的各个新特性,简单分享给大家。
一、使用VSCode新建一个.NET7.0的Console工程

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<RootNamespace>_NET7</RootNamespace>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
二、泛型属性
C # 11为开发人员提供了一种编写自定义通用属性的方法。
public class CommonAttribute<T> : Attribute
{
public T Property {get;set;} public CommonAttribute()
{ } public CommonAttribute(T realvalue) :this()
{
Property = realvalue;
}
}
新建一个类,在属性上使用这个通用属性注解。原先是多个属性注解类型,现在一个泛型属性就可以搞定了
public class User
{
[CommonAttribute<int>]
public int UserID { get; set;} [CommonAttribute<string>("defaultValue")]
public string UserName { get; set;}
}
三、非空校验
原先在C#10中,可以这么写实现参数非空校验
public User GetUser(string name)
{
ArgumentNullException.ThrowIfNull(nameof(name));
// Rest of code
}
在C#11中,在参数上加2个!就实现了非空校验

四、字符串内的换行符
字符串内插的 { 和 } 字符内的文本现在可以跨多个行。
{ 和 } 标记之间的文本分析为 C#。 允许任何合法 C#(包括换行符)。
使用此功能可以更轻松地读取使用较长 C# 表达式的字符串内插,例如模式匹配 switch 表达式或 LINQ 查询。
五、列表模式匹配
列表模式扩展了模式匹配,以匹配列表或数组中的元素序列。
例如,当 sequence 为数组或三个整数(1、2 和 3)的列表时,sequence is [1, 2, 3] 为 true。
可以使用任何模式(包括常量、类型、属性和关系模式)来匹配元素。
弃元模式 (_) 匹配任何单个元素,新的范围模式 (..) 匹配零个或多个元素的任何序列。
写几个列子看看:
var l1 = new[] { 1, 2, 3, 4, 5 };
if(l1 is [1, 2, 3, 4, 5] && l1 is [_,_,_,_,5])
{
Console.WriteLine("List Pattern Matched");
}

上述代码中,[_,_,_,_,5] ,可以这么理解:匹配长度为5且最后一个元素为5的任何集合。

同时,切片模式进一步放大了列表模式的威力。例如,如果需要将任何少于或等于5个元素的集合与最后一个元素5匹配,则可以将上述模式修改为
if (l1 is [.., 5])
{
Console.WriteLine("List Pattern Matched 3");
}
这段代码中 [..,5] 等同于 l1.Length>=1 && l1[^1]==5.
调试输出:List Pattern Matched 3
再写一个Switch模式匹配的例子
var l1 = new[] { 1, 2, 3, 4,5 };
var l2 = new[] { 1, 3, 5 };
var l3 = new[] { 1};
var l4 = new[] { 9 };
var l5 = new[] { 1,6 };
string PatternTest(int[] collection) => collection switch
{
[1, 2, 3, 4, 5] => "first", // list
[1, 3, .., 5] => "second", // slice in list
[1, _] => "third", // list
[1, ..] => "fourth", //slice in list
[..] => "fifth" // slice
};
Console.WriteLine(PatternTest(l1));
Console.WriteLine(PatternTest(l2));
Console.WriteLine(PatternTest(l3));
Console.WriteLine(PatternTest(l4));
Console.WriteLine(PatternTest(l5));

实际输出:
first
second
fourth
fifth
third
六、原始字符串
原始字符串是字符串的一种新格式。
原始字符串可以包含任意文本,包括空格、新行、嵌入引号和其他特殊字符,无需转义字符(这个很关键、也很简单)。
原始字符串以至少三个双引号 (""") 字符开头。 它以相同数量的双引号字符结尾。
通常,原始字符串在单个行上使用三个双引号来开始字符串,在另一行上用三个双引号来结束字符串。 左引号之后、右引号之前的换行符不包括在最终内容中。
详细的示例,可以看前段时间整理的一篇文章。
C#11新特性-Raw string literals原始字符串研究、示例
以上是这几天研究的C#11的新特性。分享给大家。
周国庆
2023/1/19
C#11新特性整理的更多相关文章
- C++ 11学习和掌握 ——《深入理解C++ 11:C++11新特性解析和应用》读书笔记(一)
因为偶然的机会,在图书馆看到<深入理解C++ 11:C++11新特性解析和应用>这本书,大致扫下,受益匪浅,就果断借出来,对于其中的部分内容进行详读并亲自编程测试相关代码,也就有了整理写出 ...
- [转载] C++11新特性
C++11标准发布已有一段时间了, 维基百科上有对C++11新标准的变化和C++11新特性介绍的文章. 我是一名C++程序员,非常想了解一下C++11. 英文版的维基百科看起来非常费劲,而中文版维基百 ...
- C++11新特性总结 (二)
1. 范围for语句 C++11 引入了一种更为简单的for语句,这种for语句可以很方便的遍历容器或其他序列的所有元素 vector<int> vec = {1,2,3,4,5,6}; ...
- C++11新特性总结 (一)
1. 概述 最近在看C++ Primer5 刚好看到一半,总结一下C++11里面确实加了很多新东西,如果没有任何了解,别说自己写了,看别人写的代码估计都会有些吃力.C++ Primer5是学习C++1 ...
- C++ 11 新特性
C++11新特性: 1.auto 2.nullptr 3.for 4.lambda表达式 5.override ...
- 在C++98基础上学习C++11新特性
自己一直用的是C++98规范来编程,对于C++11只闻其名却没用过其特性.近期因为工作的需要,需要掌握C++11的一些特性,所以查阅了一些C++11资料.因为自己有C++98的基础,所以从C++98过 ...
- C++11新特性——range for
很多编程语言都有range for语法功能,自C++11起,终于将这个重要功能加入C++标准中.range for语句,可以方便的遍历给定序列中的每个元素并对其执行某种操作. 1.基本语法 for(d ...
- C++11新特性——大括号初始化
C++11之前,C++主要有以下几种初始化方式: //小括号初始化 string str("hello"); //等号初始化 string str="hello" ...
- C++11新特性之六——元编程
C++11新特性之六——元编程
- C++11新特性之一——Lambda表达式
C++11新特性总结可以参考:http://www.cnblogs.com/pzhfei/archive/2013/03/02/CPP_new_feature.html#section_6.8 C++ ...
随机推荐
- 齐博x1 小程序与公众号长期永久订阅消息的申请方法
要给用户发送消息提醒的话,需要申请订阅消息.订阅消息分一次性订阅与长期永久性订阅.一次性订阅没有实际意义,用户订阅一次就只能发送一次.这里主要是指导大家如何申请永久长期订阅功能.对于公众号而言,大家先 ...
- Windows7下驱动开发与调试体系构建——4.在x64下使用汇编代码(x86下的_asm)
目录/参考资料:https://www.cnblogs.com/railgunRG/p/14412321.html asm文件设置 在vs x64中无法使用_asm关键字,需要使用.asm文件. 按第 ...
- Element基本组件
Element按钮组件: <el-row> <el-button>默认按钮</el-button> <el-button type="primary ...
- 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(济南)-L Bit Sequence
题意 给你两个数l,m,大小为m的数组a,求[0,l]之间满足以下条件的数x的个数: 对于任何i输入[0,m-1],f(x+i)%2=a[i]:f(k):代表k在二进制下1的个数 m的范围<=1 ...
- Codeforces Round #811 (Div. 3)D. Color with Occurrences
题目大意:给出一个文章t和n个字符串s1,s2...sn: 问能否用这n个字符串将整个文章覆盖: 思路:贪心(最小区间覆盖) 记录每个字符串能够覆盖的所有位置(起点,终点,编号) 排序后贪心的求出是否 ...
- nginx安装及相关操作
工作中经常用到nginx,今天写个自动部署nginx的脚本.nginx版本选用:1.20.2 1.创建nginx安装脚本(nginx.sh) [root@iZ2ze7uphtapcv51egcm7rZ ...
- Java环境搭建(推荐jdk8)
本人使用的Windows10操作系统 1.Jdk8下载和安装 下载地址:https://www.oracle.com/cn/java/technologies/javase/javase-jdk8-d ...
- SketchUp2020免费中文完整版官网2021教程模型库下载
SketchUp2022 WIN10 64位安装步骤: 1.先使用"百度网盘客户端"下载SU22_CN_x64安装包到电脑磁盘里,并鼠标右击进行解压缩,然后找到SketchUpPr ...
- 自学 TypeScript 第一天 环境开发配置 及 TS 基本类型声明
前言: 自学第一天,什么是TS ,为什么要用 TS TS 全程 Typed JavaScript at Any Scale 解释起来就是 添加了类型系统的 JavaScript, 是 JavaScr ...
- Shell脚本--信号发送与捕捉
信号(Signal):信号是在软件层次上对中断机制的一种模拟,通过给一个进程发送信号,执行相 应的处理函数. 进程可以通过三种方式来响应一个信号: 忽略信号,即对信号不做任何处理,其中有两个信号不能忽 ...