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

本文转载于网络 如有侵权请联系删除

相关文章

  • 函数的节流与防抖

    1.概念节流:事件触发后,规定时间内,事件处理函数不能再次被调用。也就是说在规定的时间内,函数只能被调用一次,且是最先被触发调用的那次。防抖:多次触发事件,事件处理函数只能执行一次,并且是在触发操作结束时执行。也就是说,当一个事件被触发准备执行事件函数前,会等待一定的时间,如果没有再次触发,那么就执行,如果被触发了,那就本次作废,重新从新触发的时间开始计算,并再次等待1秒,知道能最终执行。2.使用场景节流:滚动加载更多、搜索框搜索联想功能、高频点击、表单重复提交防抖:搜索框搜索输入,并输入完成以后自动搜索;手机号,邮箱验证输入检测;窗口大小resize变化后,再重新渲染3.代码实例/* *函数节流 */ functionthrottle(fn,wait){ letlast=0 letdur=wait||400 returnfunction(){ letself=this constcurrent_time=newDate() if(current_time-last>dur){ fn.apply(self,arguments) last=+newDate() } } } /*

  • 使用Zookeeper分布式部署PHP应用程序

    Zookper是一种分布式的,开源的,应用于分布式应用的协作服务。它提供了一些简单的操作,使得分布式应用可以基于这些接口实现诸如同步、配置维护和分集群或者命名的服务。Zookper很容易编程接入,它使用了一个和文件树结构相似的数据模型。虽然ZooKeeper是一个Java应用程序,但C也可以使用。这里就有个PHP的扩展,你可以从PECL中下载,或从GitHub中直接获取PHP-ZooKeeper。要使用该扩展你首先要安装ZooKeeper。可以从官方网站下载。$tarzxfvzookeeper-3.4.5.tar.gz $cdzookeeper-3.4.5/src/c $./configure--prefix=/usr/ $make $sudomakeinstall复制这样就会安装ZooKeeper的库和头文件。现在准备编译PHP扩展。$gitclonehttps://github.com/andreiz/php-zookeeper.git $cdphp-zookeeper $phpize $./configure $make $sudomakeinstall复制将“zookeeper

  • Java 线程池原理与使用

    在java中我们会一般要求创建线程必须使用线程池,因为这样可以避免资源消耗,通过重复利用已经创建的线程来降低线程创建和销毁所造成的消耗,其次当任务到达时任务可以不用等到线程创建就立即执行,最后可以提高线程的管理性,管控线程,不让线程无限制创建.线程池的创建我们可以使用ThreadPoolExecutor创建线程池这里我们不适用Executors来创建线程池,是因为,Executors使用默认参数不用自定义参数,自己经常使用Executors提供的工厂方法创建线程池,所以忽略了线程池内部的实现,同时可以规避规避资源耗尽的风险.newThreadPoolExecutor(corePoolSize,maximumPoolSize,keepAliveTime, milliseconds,runnableTaskQueue,handler);复制corePoolSize(线程池的基本大小):当提交一个任务到线程池时,线程 池会创建一个线程来执行任务,即使其他空闲的基本线程能够执行新任务 也会创建线程,等到需要执行的任务数大于线程池基本大小时就不再创建。 如果调用了线程池的prestartAllC

  • 东哥陪你学PowerBI——日期表

    常在群里看到很多关于对日期表的疑问和困惑,尤其是刚进群的初学者。那今天我们就来聊一下,日期表是怎么回事,在业务分析里究竟起了什么作用?日期表,故名思义,就是存放日期的表新人常会感到困惑,业务表(销量、业绩、采购、检验、出/入库等单据)里不都有日期列吗,为什么还要把日期放在一张额外的表里?大家都知道,不管零售、制造、金融还是其他什么行业,但凡涉及到数据统计,都离不开日期维度的分析,如累计销量、环比增速、同比增长等。对于此类问题,DAX专门提供了一批函数来解决,就是“时间智能函数”(公众号之前的“东哥陪你学DAX”系列卡片已经介绍过不少)时间智能函数的参数大多以日期为主,之所以不用业务表的日期列,是因为单独日期表有以下几个特点:日期表的日期是独立完整的,没有缺失,这对时间智能函数来说很重要。业务表里的日期只有业务发生时才会有记录,否则就缺失日期表除了自带的日期列,可以衍生出其他日期相关列,诸如年、月、日、季、周等,一年365行数据。 业务表就不同了,一个公司有N个部门,一个部门有N个员工,假如每个员工每天产生一条业务数据,那一年要多少行?如果想按季统计销量,按月统计采购、按周统计销量、就必

  • 【译】一文洞察 Chrome DevTools 近半年新增了哪些功能

    ?想要了解更多不掺水的原创,请戳上方蓝色字体:政采云前端团队关注我们吧~本文首发于政采云前端团队博客:【译】一文洞察ChromeDevTools近半年新增了哪些新功能 https://www.zoo.team/article/chrome-devtools本文由政采云前端团队@子洋同学翻译,原文可访问:https://developers.google.com/web/updates/2019/09/devtools前言工欲善其事,必先利其器。ChromeDevtools是前端开发工程师不可或缺的开发工具,最近半年Chrome更新了6个版本,其中的5个版本里ChromeDevtools也更新了一些新功能,我们对最近的一些更新做了翻译整理,下面我们一起来看看近半年有哪些值得关注的新功能。DevTools(Chrome74)的新增功能高亮显示所有受CSS属性影响的节点将鼠标悬停在会影响节点盒子模型的CSS属性上,如padding或margin,会高亮显示受到这个属性声明影响的所有节点。Audits面板中的Lighthousev4新增加的Taptargetsarenotsizedapprop

  • 为何 987654321/123456789 的值是 8.0000000729

    有时候,发现987654321/123456789=8.0000000729为什么后面还有几个数字?本文告诉大家,后面几个是如何算的实际的值是8.0000000729000006633900060368490549353263999114702391943791‌​76668850507686539619‌​94751054152234592785‌​33479434654662855357‌​43198375263105214894‌​25745553774284539345‌​98930804850270324137‌​45994965088554182305‌​84305898317183674686‌​37143964598010077841‌​89170836121454608705‌​23693921765614688067‌​09366141055231883602‌​61014078375228113214‌​57583025264005529902‌​45032211229793122191‌​11741193916844864643‌​288268253923241

  • 第36天:倒计时:发动短信验证、跳转页面、关闭广告

    一、setTimeoutsetTimeout("函数",时间) setInterval(fn,5000);//每隔5秒执行一次fn setTimeout(fn,5000);//5秒之后执行一次fn二、跳转页面 window.location.href="http://www.baidu.com"; 函数自己调用自己成为“递归调用”案例:1、发送短信验证倒计时1<!DOCTYPEhtml> 2<htmllang="en"> 3<head> 4<metacharset="UTF-8"> 5<title>Title</title> 6<style> 7.box{ 8margin:100pxauto; 9text-align:center; 10} 11#btn{ 12 13} 14</style> 15<script> 16window.onload=function(){ 17varbtn=documen

  • FluorineFx:远程共享对象(Remote SharedObjects)

    单纯从客户端上来看,FluorineFx的RSO跟FMS中的RSO几乎没什么不同(参见Flash/Flex学习笔记(15):FMS3.5之远程共享对象(RemoteSharedObject)),只不过FMS是Adobe的收费产品,FluorineFx是用于.Net平台的开源免费产品.服务端代码:1、为了防止客户端随意连接或创建任何属性的RSO,服务端可以定义一个用于安全处理的cs文件usingSystem.Collections; usingFluorineFx.Messaging.Api; usingFluorineFx.Messaging.Api.SO; namespace_02_SharedObject { publicclassSampleSOSecurityHandler:ISharedObjectSecurity { #regionISharedObjectSecurityMembers //是否允许连接 publicboolIsConnectionAllowed(ISharedObjectso) { returntrue; } //是否允许创建rso对象(下面的代码

  • 微信 Android 视频编码爬过的那些坑

    Android的视频相关的开发,大概一直是整个Android生态,以及AndroidAPI中,最为分裂以及兼容性问题最为突出的一部分。摄像头,以及视频编码相关的API,Google一直对这方面的控制力非常差,导致不同厂商对这两个API的实现有不少差异,而且从API的设计来看,一直以来优化也相当有限,甚至有人认为这是“Android上最难用的API之一”以微信为例,我们录制一个540p的mp4文件,对于Android来说,大体上是遵循这么一个流程:大体上就是从摄像头输出的YUV帧经过预处理之后,送入编码器,获得编码好的h264视频流。上面只是针对视频流的编码,另外还需要对音频流单独录制,最后再将视频流和音频流进行合成出最终视频。这篇文章主要将会对视频流的编码中两个常见问题进行分析:视频编码器的选择(硬编or软编)?如何对摄像头输出的YUV帧进行快速预处理(镜像,缩放,旋转)?视频编码器的选择对于录制视频的需求,不少app都需要对每一帧数据进行单独处理,因此很少会直接用到MediaRecorder来直接录取视频,一般来说,会有这么两个选择MediaCodecFFMpeg+x264/open

  • KDD'22 | 自监督超图Transformer构建推荐系统

    标题:Self-SupervisedHypergraphTransformerforRecommenderSystems 链接:https://arxiv.org/pdf/2207.14338.pdf 代码:https://github.com/akaxlh/SHT 会议:KDD2022 学校:港大1.导读 2.方法2.1局部图结构学习首先,将用户和商品嵌入到d维潜在空间中,以编码他们的交互模式。对于用户u_i和商品v_j,分别生成embedding向量e_i,e_j\in\mathbb{R}^d。聚合所有用户和商品embedding构成相应的矩阵E^{(u)}\in\mathbb{R}^{I\timesd},E^{(v)}\in\mathbb{R}^{J\timesd}。局部结构的学习采用常见的图神经网络方式,将每个节点的相邻子图结构编码为图拓扑感知embedding,以将拓扑位置信息注入图Transformer。SHT采用了一个两层的轻量级图卷积网络,如下所示,其中\bar{\mathcal{A}}表示标准化后的图邻接矩阵,计算方式为\overline{\mathcal{A}}_{

  • Python

    1.python优点简单易学,开元免费,解释性语言,面向对象,功能强大,可扩展性,可移植性复制 2.变量的类型数字,布尔类型,字符串,列表,元祖,字典复制 3.标识符命名规则1.标识符由字母、下划线和数字组成,且不能以数字开头。2.Python中的标识符是区分大小写的3.Python中的标识符不能使用关键字4.见名知意5.命名按照大驼峰小驼峰方式命名复制 4.如何在python中查找关键字cmd进入终端输入python输入importkeyword输入keyword.kwlist复制 5.常用的格式符号有哪些(3个即可)%s通过str()字符串转换来格式化%c字符%d有符号十进制整数%f浮点实数复制 6.运算符(至少5个)+加-减*乘/除%取模-返回除法的余数**幂-返回x的y次幂//取整除-返回商的整数部分(向下取整)复制 7.python常用的数据类型转换(至少3个复制       8.计较运算符(至少3个)==!=<=>=<>复制 9.逻辑运算符是哪3个andornot复制 复制 10.自己写一个if-elif-else条件

  • 【读书笔记】读《JavaScript设计模式》之门面模式

    一、前言   门面模式,也称Facade(外观)模式。核心的两点作用——   1> 简化类的接口(让接口变得更加容易理解、容易应用、更加符合对应业务),来掩盖一个非常不同或者复杂的实现   2> 消除类与使用它的客户代码之间的耦合   可以把门面模式想成是简化API来展示给其他开发人员,通常都是可以提高可用性。   二、举例   例子一、事件监听 functionaddEvent(el,type,fn){ if(window.addEventListener){ el.addEventListener(type,fn,false); }elseif(window.attachEvent){ el.attachEvent('on'+type,fn); }else{ el['on'+type]=fn; } }复制   有了这个门面,就有了一种为DOM节点添加事件监听器的简便方法,就不必再为每次为一个元素添加事件监听器都得针对浏览器间的差异进行检查而烦恼。      例子二、组合函数 functiona(x){ //dostuffhere...

  • [转]OpenCV使用之-----BruteForceMatcher无法使用

    最近Opencv升级比较快,从2.4.0到2.4.1到2.4.2,使得我这个还在使用2.3.1的人很不好意思,而且听说新版本里添加了tbb并行功能,急着想用这些功能的我赶紧下了2.4.2。 按部就班的解压、设置c++目录(我使用的是vs2008)、设置环境变量......一系列的完成之后,想用一下surf算法,就尝试着把pdf文档里的代码复制到了vs里,运行一下,发现不行,报错。。。瞬间有点被骗的感觉,这可是从官方发布的pdf里的最新代码啊!!! #include<iostream> #include"opencv2/core/core.hpp" #include"opencv2/features2d/features2d.hpp" #include"opencv2/highgui/highgui.hpp" #include"opencv2/nonfree/nonfree.hpp" #include"opencv2/nonfree/features2d.hpp" usingnamespacestd; usingnamespacecv; char*path1="D:\\T

  • 12.JDK8以上提高开发效率有哪些【双元】(2)

                                                 

  • 网络应用编程中的 ref

    C#中的数据有两种类型:引用类型(referencetypes)和值类型(valuetypes) 其实,你也不用理解得多复杂! 你只要知道,如果用上ref的话,操作的是同一个变量, 所以会改变值,如果没用上ref的话,操作的不是同一个变量,所以值不会改变。 这就行了!其他的,以后学得深入了,你就会懂了!现在弄这些问题,只会令你学得很痛苦的! 只不过用ref的话,调用的参数要在调用前就要初始化,初始化,你懂吧?就是赋值!

  • 使用EntityFramework6完成增删查改和事务

    使用EntityFramework6完成增删查改和事务上一节我们已经学习了如何使用EF连接数据库,并简单演示了一下如何使用EF6对数据库进行操作,这一节我来详细讲解一下。使用EF对数据库进行操作,整个过程就像操作数组一样,我们只管修改或向集合中添加值,最后通知EF保存修改后的结果就可以了。准备工作为了演示,我在数据库中建了两张表。class表用于表示班级,class_id是班级编号,class_name是班级名称。第二张表是学生表student,student_id为学生编号,name为姓名,age为年龄,class_id是学生所属班级,student表中的class_id与class表中的class_id存在外联关系。 数据结构关系图 数据库建好后,按照上一节介绍的步骤我们直接通过向导来生成EF代码。执行完成后VS为我们生成了三个类,分别是DBModel、_class、student,其中DBModel代表的是数据库,而_class和student则分别代表班级表和学生表。先来看看DBModel类,DBModel相当于一个数据库,之后你new一个DBModel就相当于打开了一次数据库

  • $[NOIp2017]$ 逛公园 $dp$/记搜

    \(Des\) 给定一个有向图,起点为\(1\),终点为\(n\),求和最短路相差不超过\(k\)的路径数量.有\(0\)边.如果有无数条,则输出\(-1\). \(n\leq10^5,k\leq50\) \(Sol\) 首先,有无数条边的情况一定是在与最短路相差不超过\(k\)的一条路上有\(0\)环. 先不考虑\(0\)边和\(0\)环,\(get\70pts\)做法:先跑一个最短路,\(dis[i]\)表示从\(1\)到\(i\)的最短路径.记\(f[u][k]\)表示从\(1\)到\(u\)路径长度不超过\(dis[u]+k\)的路径条数,\(f[u][k]\)显然是转移到\(f[v][dis[u]+k+w(u,v)-dis[v]]\).转移顺序显然是从\(dis\)小的转移到\(dis\)大的,直接按\(dis\)从小到大的顺序.于是一个\(O(NK)\)的\(dp\)就出炉了. 考虑正解. 首先看怎么判断无穷解.记\(f_i\)为\(1\)到\(i\)的最短路,\(g_i\)为\(i\)到\(n\)的最短路.判断无穷解:先把所有可行的\(0\)边拎出来,再看它们是不是组成了

  • 关于换个jdk引发的血案,对一个新的eclipse如何下手

    总结一下今天一天发生的问题。。气的上火 1.先是eclipse,换了JDK后,我的ecplise不兼容JDK7,但是我去官网总是下不到对的版本,结果是进错网页,没有搞清楚哪个eclipse对应哪个版本对应哪个名字 2.然后是mavensetting.xml中配置没有改过来,结果eclipse一update就会把所有的我设定好的配置全部还原,让人抓狂啊(今天copy的工程也是这种情况,让人吐血,不过我配置没错呀)3.web项目修改后不会自动发布,这个也真是,把所有配置看了一遍又一遍,完全没错,简直要气哭了,然后我看validate一直在校验springmvc.xml,看的心烦,就把校验xml关掉了,结果问题就解决了,为了证明就是这个鬼校验的原因,我又开启校验,果然,又不能自动发布了。 总之,今天一天诸多不顺,让人我鸡飞狗跳,痛不欲生      为此我整理一下换了个jdk后可能出现的问题   1.修改了环境变量后,java-version依旧是原来旧的jdk,百度上有一切办法,删除掉system32下面的所有java.exejavaw.exe文件,可

  • 日常训练.jpg

    TodoList SAM SteinerTree 2018/3/26 SRM600Div1 250枚举哪一位是个卜。 600枚举回文列的集合,然后对行进行DP,\(dp[i][j]\)代表最前的i行与最后的i行中,有j行为回文的最小耗费。我们对第i行与第n-i+1行进行决策。 两行都不回文:这个时候把列给凑对就好了&逐个施展 两行有一个回文:把两行C多个22 两行都回文:把两行拆成很多个22&逐个施展 900欧拉公式,把直线一条一条的加入进去,然后计算交点个数,然后发现交点个数互质数对个数有关。 SRM601Div1 250题意杀?枚举一共拿了多少个水果,用桶来维护每袋水果最多拿几个苹果,最少拿几个苹果。 650一脸懵逼的DP 假算法1:\(dp[i][A][B]\):考虑\(1~i\)这些数字,集合\(1\)的异或和为\(A\),集合\(2\)的异或和为\(B\),的情况有多少种。稳如gou的TLE 假算法2:\(dp[i][Dt]\):其中\(Dt=A-B\),\(Dt\)为一个三进制数字。 真算法:枚举不相等的第一位,那么在这位上,A

  • 简单图表分析(1/2)

    频率分布分析: 频率分布主要用直方图进行分析(连续数据,离散数据使用散点图),直方图是一种显示数据分布情况的柱形图,即不同数据出现的频率。通过这些高度不同的柱形,可以直观、快速地观察数据的分散程度和中心趋势。 直方图适用于连续数据的分析,因此对数据量有一定的要求。如果数据量很少时,可以直接使用散点图进行展示。   上图:数据是否正态分布 上图:数据左倾还是右倾 上图:数据是否围绕某个值紧密聚集 上图:数据是否位于设定的限制中 相关性及数据分布分析: 对于相关性及数据分布分析,我们一般使用散点图进行分析。散点图是用来判断两个变量之间的相互关系的工具,一般情况下,散点图用两组数据构成多个坐标点,通过观察坐标点的分布,判断变量间是否存在关联关系,以及相关关系的强度。如果不存在相关关系,可以使用散点图总结特征点的分布模式,即矩阵图(象限图)。 1、相关关系分析 需要注意的是,相关关系不同于因果关系,相关性表示两个变量同时变化,而因果关系是一个变量导致另一个变量变化。散点图只是一种数据的初步分析工具,能够直观的观察两组数据间可能存在什么关系,在分析的时候如果找到变量间可能存在的

  • HTTPS安全超文本传输协议

    一、什么是HTTPS 简单的理解HTTPS就是使用SSL/TLS加密内容的、安全的HTTP协议 HTTPS=HTTP+SSL/TLS    二、对称加密与非对称加密 对称加密:加密和解密使用同一密钥。简单、快速、效率高 非对称加密:加密解密密钥不同,加密使用公钥、解密使用私钥,私钥只有一人保管,公钥可以有多人知道。安全性更强、但性能消耗比对称加密大 SSL/TLS中同时使用了两种加密方式,建立连接时使用非对称加密传输产生密钥的随机数,链接建立后使用对称加密传输通信内容   三、SSL/TLS握手过程   SSL/TLS的握手过程可以用上图描述 1、客户端向服务端发送ClientHello,产生随机数random1,并说明客户端支持的加密方式和协议版本 2、服务端收到客户端请求后,返回ServerHello,同时携带随机数random2与数字证书,其中公钥在数字证书中一同发送,避免篡改。 3、客户端收到服务端ServerHello后,验证数字证书有效,使用生成随机数random3,并使用公钥加密,发送给服务端 4、服务端使用私钥解密得到random

相关推荐

推荐阅读