看看C# 6.0中那些语法糖都干了些什么(上篇)
一:自己主动初始化属性
确实这个比之前的版本号简化了一下。只是你肯定非常好奇。究竟编译器给我们做了哪些东西呢?
1 class Student
2 {
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 Student
2 {
3 private string k__BackingField = "ctrip";
4
5 public string Name
6 {
7 get
8 {
9 return k__BackingField;
10 }
11
12 set
13 {
14 k__BackingField = value;
15 }
16 }
17 }
然后再看看怎么让base::ctor在<Name>k__backingfield="ctrip"之前。
1 class Student
2 {
3 private string k__BackingField;
4
5 public string Name
6 {
7 get
8 {
9 return k__BackingField;
10 }
11
12 set
13 {
14 k__BackingField = value;
15 }
16 }
17
18 public Student()
19 {
20 k__BackingField = "ctrip";
21 }
22 }
不好意思,一不小心就扯到了变量初始化和构造函数赋值在源码级别的差别。
二:仅仅读属性初始化
这个也是一个超级好玩的属性,先来看看代码:
1 class Student
2 {
3 public string Name { get; }
4
5 public Student(string name)
6 {
7 Name = name;
8 }
9 }
可是我们记得,在之前的C#版本号是不能这么写。但如今惹不住好奇心,先去底层看看究竟生成了什么。
然后我就奇怪了,属性本来就能够是仅仅读的,如今编译器已经放开了,那是不是有问题了,我假设真的是须要一个仅仅读属性。这个该怎样是好
呢?然后我就试着在Name属性中返回一个值,果然编译器不放行。这就说明编译器在里面还做了一个貌似合理的推断。
三:Lambda充当函数体
这个听起来就有点怪怪的,还是先看个样例。
1 class Student
2 {
3 public string Name => "ctrip";
4
5 public void Print(string name) => Console.WriteLine(name);
6 }
只是当我看到这样的写法时。我也是醉了。假如你一年都没有接触C#,再回来看时。我想你肯定看不懂这些鸡巴代码了。
。。没办法。还得继续
看看IL在底层都做了些什么?
当看到IL的时候再次醉了。事实上=>不过一个{}方法体括号而已呀!
这不是徒增我们的学习成本么?然后我就继续想。这里的函数体就一条
console.wirteline语句,那我要是灌几条语句会怎么样呢?能够想象肯定是要加括号的,可是我真的加上{}后。编译器凌乱了。。。
那这个图就告诉我们。C#6.0的lamaba充当函数体的语法糖仅仅适合一条语句。假设真要做到多条语句。那你仅仅能单独提取一个方法出来。
就像以下这样。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步