C#9.0 终于来了,您还学的动吗? 带上VS一起解读吧!
2020-12-22 23:26
标签:param 函数 dft oid ros sse 链接 parameter jquery 1. 讲故事 .Net5官方链接 可以看到目前的C#9还是预览版,实现了一部分新语法供开发者提前尝鲜,从github的roslyn仓库上可以看到目前准备实现 17个新特性,现阶段已经实现了8个,其中的 In Progress 表示正在开发中。 新特性预览 2. 安装必备 下载最新的net5 sdk吧:dotnet-sdk-5.0.100-preview.5.20279.10-win-x64.exe 找好你自己的vs版本类型哦。。。 1. Target-typed new 这个取名一定要留给学易经的大师傅,没见过世面的我不敢造次,取得不佳影响时运,所谓 运去金成铁, 时来铁似金 ,不过大概意思就是说直接new你定义的局部变量的类型,用issues中总结的话就是: 接下来就是全部代码,看看使用前 和 使用后 的具体差别。 //老语法 } public class Person } 总的来说这语法还行吧,能起到延长键盘使用寿命的功效。 从字面上看大概就是说可以在lambda上使用取消参数,听起来怪怪的,那本意是什么呢?有时候lambda上的匿名方法签名的参数是不需要的,但在以前必须实打实的定义,这样就会污染方法体,也就是可以在body中被访问,如下图: 但有时候因为客观原因必须使用Func 好了,我想你大概知道啥意思了,接下来实操一把。。。 从上面的IL代码来看 匿名方法 变成了c类的 这说明什么呢?说明两个参数是真实存在的,但编译器捣了鬼,做了语法上的限制,不让你访问所谓的 _。 等等。。。有一个问题,IL中的方法签名怎么是这样的: 这说明什么?说明这个语法糖不仅需要编译器支持,更需要底层的JIT支持,那怎么证明呢?我们用windbg去底层挖一挖。。。为了方便调试,修改如下: 总的来说,C#是越来越像函数式编程靠拢,越来越像Scala,就像Jquery的口号一样:Write less,do more。 好了,先就说这两个吧,大家先安装好工具,明天继续解剖~~~ C#9.0 终于来了,您还学的动吗? 带上VS一起解读吧! 标签:param 函数 dft oid ros sse 链接 parameter jquery 原文地址:https://blog.51cto.com/huangxincheng/2525530
好消息,.NET 5.0 终于在2020年6月10日发布了第五个预览版,眼尖的同学一定看到了在这个版本中终于支持了 C# 9.0,此处有掌声,太好了!!!
二:新特性研究
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}");
}
{
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 Func
从图中可以看到,我在方法体中是找不到所谓的 _ 变量的,这就神奇了,怎么做到的呢?带着这个好奇心看看它的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
.class nested private auto ansi sealed serializable beforefieldinit ‘c‘
extends [System.Runtime]System.Object
.method assembly hidebysig
instance int32 ‘
static void Main(string[] args)
{
Func
从图中可以看到,虽然都是 _ ,但在线程栈上是完完全全的两个栈地址。 0x0000007035F7E608 和 0x0000007035F7E610。三:总结
文章标题:C#9.0 终于来了,您还学的动吗? 带上VS一起解读吧!
文章链接:http://soscw.com/index.php/essay/37665.html