C#9.0 终于来了,您还学的动吗? 带上VS一起解读吧!

一:背景

1. 讲故事

好消息,.NET 5.0 终于在2020年6月10日发布了第五个预览版,眼尖的同学一定看到了在这个版本中终于支持了 C# 9.0,此处有掌声,太好了!!!

.Net5官方链接

可以看到目前的C#9还是预览版,实现了一部分新语法供开发者提前尝鲜,从github的roslyn仓库上可以看到目前准备实现 17个新特性,现阶段已经实现了8个,其中的 In Progress 表示正在开发中。

新特性预览

2. 安装必备

  • 下载最新的net5 sdk吧:dotnet-sdk-5.0.100-preview.5.20279.10-win-x64.exe

  • 下载最新的 visual studio 2019 preview 2

找好你自己的vs版本类型哦。。。

二:新特性研究

1. Target-typed new

这个取名一定要留给学易经的大师傅,没见过世面的我不敢造次,取得不佳影响时运,所谓 运去金成铁, 时来铁似金 ,不过大概意思就是说直接new你定义的局部变量的类型,用issues中总结的话就是:


Summary: Allow Point p = new (x, y);
Shipped in preview in 16.7p1.

接下来就是全部代码,看看使用前 和 使用后 的具体差别。

class Program{static void Main(string[] args){//老语法var person = new Person("mary", "123456");//新语法Person person2 = new("mary", "123456");Console.WriteLine($"person={person}person2={person2}");}}public class Person{private string username;private string password;public Person(string username, string password){this.username = username;this.password = password;}public override string ToString(){return $"username={username},password={password} \n";}}

然后用ilspy去看看下面的il代码,是不是省略了Person,让自己心里踏实一点。

总的来说这语法还行吧,能起到延长键盘使用寿命的功效。

2. Lambda discard parameters

从字面上看大概就是说可以在lambda上使用取消参数,听起来怪怪的,那本意是什么呢?有时候lambda上的匿名方法签名的参数是不需要的,但在以前必须实打实的定义,这样就会污染方法体,也就是可以在body中被访问,如下图:

但有时候因为客观原因必须使用Func<int,int,int>这样的委托,而且还不想让方法签名的参数污染方法体,我猜测在函数式编程中有这样的场景吧,可能有点类似MVC中的EmptyResult效果。

好了,我想你大概知道啥意思了,接下来实操一把。。。

Func<int, int, int> func = (_, _) =>{return 0;};var result = func(10, 20);

从图中可以看到,我在方法体中是找不到所谓的 _ 变量的,这就神奇了,怎么做到的呢?带着这个好奇心看看它的IL代码是个什么样子。


.method private hidebysig static void Main (string[] args) cil managed
{// Method begins at RVA 0x2048// Code size 45 (0x2d).maxstack 3.entrypoint.locals init ([0] class [System.Runtime]System.Func`3<int32, int32, int32> func,[1] int32 result)IL_0000: nopIL_0001: ldsfld class [System.Runtime]System.Func`3<int32, int32, int32> ConsoleApp1.Program/'<>c'::'<>9__0_0'IL_0006: dupIL_0007: brtrue.s IL_0020IL_0009: popIL_000a: ldsfld class ConsoleApp1.Program/'<>c' ConsoleApp1.Program/'<>c'::'<>9'IL_000f: ldftn instance int32 ConsoleApp1.Program/'<>c'::'<Main>b__0_0'(int32, int32)IL_0015: newobj instance void class [System.Runtime]System.Func`3<int32, int32, int32>::.ctor(object, native int)IL_001a: dupIL_001b: stsfld class [System.Runtime]System.Func`3<int32, int32, int32> ConsoleApp1.Program/'<>c'::'<>9__0_0'IL_0020: stloc.0IL_0021: ldloc.0IL_0022: ldc.i4.s 10IL_0024: ldc.i4.s 20IL_0026: callvirt instance !2 class [System.Runtime]System.Func`3<int32, int32, int32>::Invoke(!0, !1)IL_002b: stloc.1IL_002c: ret
} // end of method Program::Main

从上面的IL代码来看 匿名方法 变成了<>c类的<Main>b__0_0方法,完整签名: ConsoleApp1.Program/'<>c'::'<Main>b__0_0'(int32, int32),然后再找一下 <Main>b__0_0 方法的定义。


.class nested private auto ansi sealed serializable beforefieldinit '<>c'extends [System.Runtime]System.Object.method assembly hidebysiginstance int32 '<Main>b__0_0' (int32 _,int32 _) cil managed{// Method begins at RVA 0x2100// Code size 7 (0x7).maxstack 1.locals init ([0] int32)IL_0000: nopIL_0001: ldc.i4.0IL_0002: stloc.0IL_0003: br.s IL_0005IL_0005: ldloc.0IL_0006: ret} // end of method '<>c'::'<Main>b__0_0'

这说明什么呢?说明两个参数是真实存在的,但编译器捣了鬼,做了语法上的限制,不让你访问所谓的 _

等等。。。有一个问题,IL中的方法签名怎么是这样的: <Main>b__0_0 (int32 _,int32 _), 大家应该知道方法签名中不可以出现重复的参数名,比如下面这样定义肯定是报错的。

这说明什么?说明这个语法糖不仅需要编译器支持,更需要底层的JIT支持,那怎么证明呢?我们用windbg去底层挖一挖。。。为了方便调试,修改如下:

static void Main(string[] args){Func<int, int, int> func = (_, _) =>{Console.WriteLine("进入方法体了!!!");Console.ReadLine();return 0;};var result = func(10, 20);}0:000> !clrstack -p
OS Thread Id: 0x52e8 (0)
0000007035F7E5C0 00007ffaff362655 ConsoleApp1.Program+c.b__0_0(Int32, Int32) [C:\5\ConsoleApp1\ConsoleApp1\Program.cs @ 13]PARAMETERS:this (0x0000007035F7E600) = 0x000001968000cb48_ (0x0000007035F7E608) = 0x000000000000000a_ (0x0000007035F7E610) = 0x0000000000000014

从图中可以看到,虽然都是 _ ,但在线程栈上是完完全全的两个栈地址。 0x0000007035F7E608 和 0x0000007035F7E610

三:总结

总的来说,C#是越来越像函数式编程靠拢,越来越像Scala,就像Jquery的口号一样:Write less,do more。

好了,先就说这两个吧,大家先安装好工具,明天继续解剖~~~

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

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

相关文章

KMP模式串匹配+Compress Words CodeForces - 1200E

题意&#xff1a; 给你若干个字符串&#xff0c;答案串初始为空。第 iii 步将第 iii 个字符串加到答案串的后面&#xff0c;但是尽量地去掉重复部分&#xff08;即去掉一个最长的、是原答案串的后缀、也是第 iii个串的前缀的字符串&#xff09;&#xff0c;求最后得到的字符串…

.NET Core 反射获取所有控制器及方法上特定标签

有个需求&#xff0c;就是在. NET Core中&#xff0c;我们想在项目 启动时&#xff0c;获取LinCmsAuthorizeAttribute这个特性标签所有出现的地方&#xff0c;把他的参数&#xff0c;放入一个集合并缓存起来&#xff0c;以便后面使用此数据用于权限验证。我们通过反射获取所有控…

[JavaWeb-Servlet]Servlet的体系结构

Servlet的体系结构 Servlet -- 接口|GenericServlet -- 抽象类|HttpServlet -- 抽象类* GenericServlet&#xff1a;将Servlet接口中其他的方法做了默认空实现&#xff0c;只将service()方法作为抽象* 将来定义Servlet类时&#xff0c;可以继承GenericServlet&#xff0c;实现…

折半搜索+洛谷 P2962 [USACO09NOV]Lights G

题意&#xff1a; 有 n盏灯&#xff0c;每盏灯与若干盏灯相连&#xff0c;每盏灯上都有一个开关&#xff0c;如果按下一盏灯上的开关&#xff0c;这盏灯以及与之相连的所有灯的开关状态都会改变。一开始所有灯都是关着的&#xff0c;你需要将所有灯打开&#xff0c;求最小的按…

将数据从 SQL Server 导入 Azure Storage Table

点击上方蓝字关注“汪宇杰博客”导语最近有个需求要将数据存储从 SQL Server 数据库切换到 Azure Storage 中的 Table。然而不管是 SSMS 还是 Azure Portal 都没有提供直接的导入功能&#xff0c;是不是又想自己写程序去导数据了&#xff1f;其实不用&#xff01;没有点过数据库…

[JavaWeb-HTTP]HTTP概念

HTTP&#xff1a; * 概念&#xff1a;Hyper Text Transfer Protocol 超文本传输协议* 传输协议&#xff1a;定义了&#xff0c;客户端和服务器端通信时&#xff0c;发送数据的格式* 特点&#xff1a;1. 基于TCP/IP的高级协议2. 默认端口号:803. 基于请求/响应模型的:一次请求对…

Good Number Gym - 102769G 2020年CCPC秦皇岛分站赛

题意&#xff1a; 如果一个数字是Good Number&#xff0c;当且仅当 ⌊xk⌋\left \lfloor\sqrt[k]{x}\right \rfloor⌊kx​⌋(向下取整) 能整除 x 。 现在给出 n,k &#xff0c;求 1 到 n 之中Good Number 的个数。 题目&#xff1a; Alex loves numbers. Alex thinks that…

【完整目录】每天5分钟用C#学习数据结构

【基础知识】| 作者 / Edison Zhou这是恰童鞋骚年的第250篇原创内容不知不觉&#xff0c;每天5分钟学习数据结构就更新完了&#xff0c;本篇将该系列所有文章整理起来作为一个目录&#xff0c;方便你的快速阅读。1线性表线性表是最简单也是在编程当中使用最多的一种数据结构。例…

.NET 5 开发WPF - 美食应用登录UI设计

点击上方“Dotnet9”添加关注哦Demo演示&#xff1a;演示动画你的时间宝贵&#xff0c;不想看啰嗦的文字&#xff0c;可直接拉到文末下载源码&#xff01;1. 新建项目站长开发环境&#xff1a;VS 2019企业版 16.70.NET 5 Preview 5.NET 5 WPF 项目模板和 .NET Core 3.1 WPF 项目…

[JavaWeb-HTTP]HTTP_请求消息_请求头请求体

请求消息数据格式 1. 请求行请求方式 请求url 请求协议/版本GET /login.html HTTP/1.1* 请求方式&#xff1a;* HTTP协议有7中请求方式&#xff0c;常用的有2种* GET&#xff1a;1. 请求参数在请求行中&#xff0c;在url后。2. 请求的url长度有限制的3. 不太安全* POST&#xf…

字典树模板+洛谷P2580 于是他错误的点名开始了

题目&#xff1a; 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人。 他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次&#xff0c;然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉&#xff08;详情请见已结束比赛 CON900&#xff09;。 题目描述 这之…

基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(五)

系列文章使用 abp cli 搭建项目给项目瘦身&#xff0c;让它跑起来完善与美化&#xff0c;Swagger登场数据访问和代码优先自定义仓储之增删改查统一规范API&#xff0c;包装返回模型再说Swagger&#xff0c;分组、描述、小绿锁接入GitHub&#xff0c;用JWT保护你的API异常处理和…

[JavaWeb-Servlet]概述与快速入门

Servlet&#xff1a; server applet * 概念&#xff1a;运行在服务器端的小程序* Servlet就是一个接口&#xff0c;定义了Java类被浏览器访问到(tomcat识别)的规则。* 将来我们自定义一个类&#xff0c;实现Servlet接口&#xff0c;复写方法。* 快速入门&#xff1a;1. 创建Ja…

01tire+洛谷P4551 最长异或路径

题目&#xff1a; 给定一棵n个点的带权树&#xff0c;结点下标从1开始到N。寻找树中找两个结点&#xff0c;求最长的异或路径。 异或路径指的是指两个结点之间唯一路径上的所有边权的异或。 输入格式 第一行一个整数NN&#xff0c;表示点数。 接下来 n−1 行&#xff0c;给…

C#9.0 终于来了,带你一起解读 nint 和 Pattern matching 两大新特性玩法

一&#xff1a;背景1. 讲故事上一篇C#9.0 终于来了&#xff0c;您还学的动吗&#xff1f; 带上VS一起解读吧&#xff01;跟大家聊到了Target-typed new 和 Lambda discard parameters&#xff0c;看博客园和公号里的阅读量都达到了新高&#xff0c;甚是欣慰&#xff0c;不管大家…

[JavaWeb-Tomcat]web服务器软件_Tomcat介绍

Tomcat&#xff1a;web服务器软件 1. 下载&#xff1a;http://tomcat.apache.org/2. 安装&#xff1a;解压压缩包即可。* 注意&#xff1a;安装目录建议不要有中文和空格3. 卸载&#xff1a;删除目录就行了4. 启动&#xff1a;* bin/startup.bat ,双击运行该文件即可* 访问&…

软件设计模式期末大作业——可乐商城管理系统

文章目录设计模式大作业软 件 设 计 模 式 任 务 书设计要求&#xff1a;学生应完成的工作&#xff1a;1. 应用场景描述2. 设计模式选择3. 实现语言与工具参考文献阅读&#xff1a;工作计划&#xff1a;一、系统目标1. 设计目的2. 需求描述二、 系统模式选择1.需求分析2.选用设…

深度解读Microsoft Build 2020:提升开发效率,优化开发环境

Microsoft Build 2020在众多新产品与技术发布中圆满落幕但身为开发技术人深知技术世界的更迭、求索却从未止步唯有不断提升自身技能栈创新方能从技术浮沉中获得更多养分让技术予力世界更有温度Microsoft Build 2020大会后&#xff0c; Visual Studio Family 和 .NET 成为众多开…

[JavaWeb]web相关概念回顾

web相关概念回顾 1. 软件架构1. C/S&#xff1a;客户端/服务器端2. B/S&#xff1a;浏览器/服务器端2. 资源分类1. 静态资源&#xff1a;所有用户访问后&#xff0c;得到的结果都是一样的&#xff0c;称为静态资源.静态资源可以直接被浏览器解析* 如&#xff1a; html,css,Jav…

Github 数据洞察之复杂信息网络

摘要&#xff1a;开源协作是数字化时代的必备技能&#xff0c;而背后的开发行为分析&#xff0c;能够让你看到一幅开源世界的全景图&#xff1b;2020年2月&#xff0c;X-lab 开放实验室联合InfoQ发布了《GitHub 2019 数字年报》&#xff0c;收到了业界的一致好评。数据科学与工…