看看C# 6.0中那些语法糖都干了些什么(上篇)

看看C# 6.0中那些语法糖都干了些什么(上篇),第1张

概述今天没事,就下了个vs2015 preview,前段时间园子里面也在热炒这些新的语法糖,这里我们就来看看到底都会生成些什么样的IL? 一:自动初始化属性     确实这个比之前的版本简化了一下,不过你肯定很好奇,到底编译器给我们做了哪些东西呢?1 class Student2 {3 public string Name { get; set; } = "ctrip";4 } 从这张图中可以看到,在ctor中<Name>k__backingfield=“ctrip“的赋值在base::ctor之前,这就说明name是变量初始化赋值,而不属于构造函数赋值,那有什么区别呢,如果base::ctor在<Name>k__backingfield=”ctrip"之前,那就是构造函数赋值了,不过我得特别要指明一下,是源代码级别的区别,而不是IL中的区别,因为在IL中都是构造函数赋值,不过语句顺序不一样而已,然后我把内部做的代码复原如下:1 class Student2 {3 private string k__BackingField = "ctrip";45 public string Name6 {7 get8 {9 return k__BackingField;10 }1112 set13 {14 k__BackingField = value;15 }16 }17 }然后再看看怎么让base::ctor在<Name>k__backingfield="ctrip"之前。1 class Student2 {3 private string k__BackingField;45 public string Name6 {7 get8 {9 return k__BackingField;10 }1112 set13 {14 k__BackingField = value;15 }16 }1718 public Student()19 {20 k__BackingField = "ctrip";21 }22 } 不好意思,一不小心就扯到了变量初始化和构造函数赋值在源代码级别的区别。 二:只读属性初始化这个也是一个超级好玩的属性,先来看看代码:1 class Student2 {3 public string Name { get; }45 public Student(string name)6 {7 Name = name;8 }9 }但是我们记得,在之前的C#版本是不能这么写,但现在惹不住好奇心,先去底层看看到底生成了什么。  然后我就奇怪了,属性本来就可以是只读的,现在编译器已经放开了,那是不是有问题了,我如果真的是需要一个只读属性,这个该如何是好呢?然后我就试着在Name属性中返回一个值,果然编译器不放行,这就说明编译器在里面还做了一个貌似合理的判断。 三:Lambda充当函数体这个听起来就有点怪怪的,还是先看个例子。1 class Student2 {3 public string Name => "ctrip";45 public void Print(string name) => Console.WriteLine(name);6 }不过当我看到这种写法时,我也是醉了,假如你一年都没有接触C#,再回来看时,我想你肯定看不懂这些鸡巴代码了。。。没办法,还得继续看看IL在底层都做了些什么? 当看到IL的时候再次醉了,其实=>仅仅是一个{}方法体括号而已呀!这不是徒增我们的学习成本么?然后我就继续想,这里的函数体就一条console.wirteline语句,那我要是灌几条语句会怎么样呢?可以想象肯定是要加括号的,但是我真的加上{}后,编译器凌乱了。。。 那这个图就告诉我们,C#6.0的lamaba充当函数体的语法糖只适合一条语句,如果真要做到多条语句,那你只能单独提取一个方法出来,就像下面这样。 好了,上篇大体就这样了,时间不早了,先撤了。

  今天没事,就下了个vs2015 prevIEw,前段时间园子里面也在热炒这些新的语法糖,这里我们就来看看到底都会生成些什么样的IL?

     确实这个比之前的版本简化了一下,不过你肯定很好奇,到底编译器给我们做了哪些东西呢?

从这张图中可以看到,在ctor中k__backingfIEld=“ctrip“的赋值在base::ctor之前,这就说明name是变量初始化赋值,而不属于

构造函数赋值,那有什么区别呢,如果base::ctor在k__backingfIEld=”ctrip"之前,那就是构造函数赋值了,不过我得特别要指明

一下,是源代码级别的区别,而不是IL中的区别,因为在IL中都是构造函数赋值,不过语句顺序不一样而已,然后我把内部做的代码复原如下:

然后再看看怎么让base::ctor在k__backingfIEld="ctrip"之前。

不好意思,一不小心就扯到了变量初始化和构造函数赋值在源代码级别的区别。

  这个也是一个超级好玩的属性,先来看看代码:

但是我们记得,在之前的C#版本是不能这么写,但现在惹不住好奇心,先去底层看看到底生成了什么。

然后我就奇怪了,属性本来就可以是只读的,现在编译器已经放开了,那是不是有问题了,我如果真的是需要一个只读属性,这个该如何是好

呢?然后我就试着在name属性中返回一个值,果然编译器不放行,这就说明编译器在里面还做了一个貌似合理的判断。

  这个听起来就有点怪怪的,还是先看个例子。

不过当我看到这种写法时,我也是醉了,假如你一年都没有接触C#,再回来看时,我想你肯定看不懂这些鸡巴代码了。。。没办法,还得继续

看看IL在底层都做了些什么?

当看到IL的时候再次醉了,其实=>仅仅是一个{}方法体括号而已呀!这不是徒增我们的学习成本么?然后我就继续想,这里的函数体就一条

console.wirteline语句,那我要是灌几条语句会怎么样呢?可以想象肯定是要加括号的,但是我真的加上{}后,编译器凌乱了。。。

那这个图就告诉我们,C#6.0的lamaba充当函数体的语法糖只适合一条语句,如果真要做到多条语句,那你只能单独提取一个方法出来,

就像下面这样。

好了,上篇大体就这样了,时间不早了,先撤了。

总结

以上是内存溢出为你收集整理的看看C# 6.0中那些语法糖都干了些什么(上篇)全部内容,希望文章能够帮你解决看看C# 6.0中那些语法糖都干了些什么(上篇)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1264095.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存