当前位置:首页 > Windows程序 > 正文

C#语法糖,甜过初恋

2021-03-28 Windows程序

技术分享


       偶然翻看了n年前自己写的几篇技术博文,真真切切切切实实实实在在有恍如隔世之感。当年那么晦涩枯燥的汇编代码亦能写的行云流水般,如今却几乎看不懂了,让美貌与智慧为化身的作者君那颗强大的玻璃心飘过一丝蛋蛋的忧伤。于是乎,不仅感叹计算机语言技术的发展速度,以及对生产效率带来的影响,其中C#的语法糖具有相当突出的代表性。语法糖比那些貌美如花嗲的掉渣的程序员鼓励师实用多了。

趁月落乌啼夜黑风高好下手,赶紧把当前的C#语法糖整理和汇总一下,第一温故知新,第二备忘,第三给需要的人参考,不足之处欢迎批评斧正,和谐社会禁止拍砖。魏滔序原创,欢迎转载但请注明出处。

先看一段来自百度百科的解释:
       语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。

.Net从2.0到3.0到3.5底层CLR并没有做更新,没有添加任何新的IL指令,所以C#从2.0到3.0中所有的特性都是语法糖,就算从1.0到2.0,也只有一个泛型不是语法糖,其余的新特性也都是如此,但是每一次C#发布新特性的时候我们不得不为之而鼓舞,为之而喝彩。新的语法可以酿造更好的编程风格,一些难以实现的方面也轻而易举了。

题外话:忽然赶脚CSDN的编辑器比n年前一成不变的难用好用多了,此处给个赞(宇宙全无敌黄金广告位招租),下面言归正传。

属性(Property)

常规写法如下:

public class Product { private string _name; public Product() { _name = "白色经典长袖衬衫"; //或者 //Name = "白色经典长袖衬衫"; } public string Name { get { return _name; } set { _name = value; } } }

或者如下:

public class Product { private string _name = "白色经典长袖衬衫"; public string Name { get { return _name; } set { _name = value; } } }

两者的区别只是赋初始值时机不同,代码的冗余量不相上下,在C#3.0后,语法做了如下的简化处理:

public class Product { public Product() { Name = "白色经典长袖衬衫"; } public string Name { get; set; } }

属性声明一行足矣,代码冗余量大幅减少,当然也不会因此失去灵活性,比如给get或set指定访问限制符:

public string Name { protected internal get; set; }

然而,善解人衣的MS工程师们认为这样还是甜不过初恋,在C#6.0中又撒了一把糖(自动属性初始化器),且看:

public class Product { public string Name { get; set; } = "白色经典长袖衬衫"; }

从开始的那么一大坨变成一行,多么令人陶醉的写法。需要注意的是在C#6.0中,除了以上方法直接赋值外,在构造函数中也可以为只读属性赋值,之前。。。那是不允许滴:

public class Product { public string Name { get; } public Product() { Name = "白色经典长袖衬衫"; } }

但是,如果在声明中已经赋值,那么在构造函数中依然不允许,编译器是位多么称职的保姆啊啊啊。

public class Product { public string Name { get { return "白色经典长袖衬衫"; } } //C#6.0中还可以使用属性表达式为只读属性赋值,如下行代码: //public string Name => "白色经典长袖衬衫"; public Product() { Name = "白色经典长袖衬衫"; //编译器说了,不要酱紫嘛 } }

这糖,甜过初恋。

可空类型(T?)
可空类型可以表示基础类型的所有值,另外还可以表示 null 值。可空类型可通过下面两种方式中的一种声明:

System.Nullable<T> variable //或 T? variable

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/69007.html