看看C# 6.0中那些语法糖都干了些什么(中篇)
接着上篇继续扯,其实语法糖也不是什么坏事,第一个就是吃不吃随你,第二个就是最好要知道这些糖在底层都做了些什么,不过有一点
叫眼见为实,这样才能安心的使用,一口气上五楼,不费劲。
一:字符串嵌入值
我想String.Format方法就是化成灰大家都认识,比如下面代码:

1 class Bird
2 {
3 private string Name = "swallow";
4
5 public void Fly()
6 {
7 var result = string.Format("hello {0}", Name);
8 }
9 }

这个Format有一个不好的地方就是,如果占位符太多,就特别容易搞错,如果你少了一个参数,代码就会报错。

接下来跟趟顺风车,去看看string.Format底层代码,还是蛮惊讶的发现,其实底层不过调用的就是StirngBuilder.AppendFormat方法。

因为容易报错,所以为了保险起见就用字符串拼接的方式来实现,但是我也知道字符串拼接是耗时的一种操作,写个StringBuilder又嫌麻烦,
还好C#6.0中提供了一种新鲜玩法,先看代码:

1 class Bird
2 {
3 private string Name = "swallow";
4
5 public void Fly()
6 {
7 //var result = string.Format("hello {0}{1}", Name);
8
9 var result = "\{"hello"}:\{Name}";
10
11 Console.WriteLine(result);
12 }
13 }

然后就迫不及待的去看看底层怎么玩的,其实在下面的IL图中可以看到,在底层最终还是调用了String.Format方法来实现的。

二:using静态类
这种写法看起来有点不伦不类的,乍一看也没有什么用处,不过可以告诉我们一个原理,就是不管你上层怎么变,编译器还是一样使用
全命名,这就叫万变不离其宗吧。

三:空值判断
先还是来看看这种玩法的真容。

1 class Bird
2 {
3 public void Fly(string name)
4 {
5 var result = name?.Length;
6 }
7 }

是不是看着有点眼晕?那就对了,编译器就是这样静静的端着碗看着我们写这些装逼的代码,不过再怎么装逼,也逃不过ILdasm的眼睛。

其实仔细看IL代码之后,觉得一切还是那么的熟悉,重点就是这个brtrue.s。它的状态也决定了两条执行流,不过在IL上面也看到了V_1这个编译
器给我们单独定义的一个变量,代码还原如下:

1 class Bird
2 {
3 public void Fly(string name)
4 {
5 int? r;
6
7 if (name == null)
8 {
9 int? V_1 = new Nullable<int>();
10
11 r = V_1;
12 }
13 else
14 {
15 r = new Nullable<int>(name.Length);
16 }
17 }
18 }

四:nameof表达式
当我知道这个关键字的用途时,我的第一反应就是公司框架里面的LogManager类,当我们new LogManager的时候,会同时把当前的类名
传递下去,然后做些后期处理,但是在以前我们只能这么做,要么用反射,要么写死。

1 namespace ConsoleApplication3
2 {
3 class Program
4 {
5 static void Main(string[] args)
6 {
7 //第一种:使用反射
8 var ilog = new LoggerManager(typeof(Program));
9
10 //第二种:写死
11 ilog = new LoggerManager("Program");
12
13 Console.WriteLine("world");
14 }
15 }
16
17 class LoggerManager
18 {
19 /// <summary>
20 /// 构造函数记录下类名
21 /// </summary>
22 /// <param name="type"></param>
23 public LoggerManager(Type type)
24 {
25 //todo
26 Console.WriteLine(type.Name);
27 }
28 public LoggerManager(string className)
29 {
30 //todo
31 Console.WriteLine(className);
32 }
33 }
34 }


我想大家也能看到,第一种使用了反射,这是需要读取元数据的,性能你懂的,第二个虽然是字符串,你也看到了,是写死的方式,这个时候就
急需一个加强版,就像下面这样。

看到IL后,反正我是鸡动了。。。nameof具有上面两者的优点,既灵活,性能又高。。。。不错不错,赞一下。
看看C# 6.0中那些语法糖都干了些什么(中篇)的更多相关文章
- 看看C# 6.0中那些语法糖都干了些什么(终结篇)
终于写到终结篇了,整个人像在梦游一样,说完这一篇我得继续写我的js系列啦. 一:带索引的对象初始化器 还是按照江湖老规矩,先扒开看看到底是个什么玩意. 1 static void Main(strin ...
- 看看C# 6.0中那些语法糖都干了些什么(上篇)
今天没事,就下了个vs2015 preview,前段时间园子里面也在热炒这些新的语法糖,这里我们就来看看到底都会生成些什么样的IL? 一:自动初始化属性 确实这个比之前的版本简化了一下,不过你肯定很好 ...
- js中的new关键字都干了些什么?
new 操作符 在有上面的基础概念的介绍之后,在加上new操作符,我们就能完成传统面向对象的class + new的方式创建对象,在javascript中,我们将这类方式成为Pseudoclassic ...
- Java 中的语法糖
百度百科对语法糖的定义 语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这 ...
- [转]谈谈Java中的语法糖
*该博客转自 http://blog.csdn.net/danchu/article/details/54986442 语法糖(Syntactic Sugar),也称糖衣语法,指在计算机语言中添加的某 ...
- JVM(二):Java中的语法糖
JVM(二):Java中的语法糖 上文讲到在语义分析中会对Java中的语法糖进行解糖操作,因此本文就主要讲述一下Java中有哪些语法糖,每个语法糖在解糖过后的原始代码,以及这些语法糖背后的逻辑. 语法 ...
- 浅析java中的语法糖
概述 编译器是一种计算机程序, 它主要的目的是将便于人编写.阅读.维护的高级计算机语言所写的源代码程序, 翻译为计算机能解读.运行的低阶机器语言的程序, 即可执行文件.而 javac 就是java语言 ...
- 【Java基础】Java中的语法糖
目录 Java中的语法糖 switch对String和枚举类的支持 对泛型的支持 包装类型的自动装箱和拆箱 变长方法参数 枚举 内部类 条件编译 断言 数值字面量 for-each try-with- ...
- C# 6.0新特性---语法糖
转载:http://www.cnblogs.com/TianFang/p/3928172.html 所谓语法糖就是在编译器里写做文章,达到简化代码书写的目的,要慎重使用,省略过多不易理解. NULL检 ...
随机推荐
- ucos实时操作系统学习笔记——任务间通信(互斥锁)
想讲一下ucos任务间通信中的mutex,感觉其设计挺巧妙,同sem一样使用的是event机制实现的,代码不每一行都分析,因为讲的没邵贝贝老师清楚,主要讲一下mutex的内核是如何实现的.可以理解互斥 ...
- 2016年我们重新思考移动互联网创业的风险, 微信还是APP?
感觉这两年前端开发又火起来了,很多做内容创业和做微电商创业的人,往往都选择了运营微信号.对于做纯技术开发的人来说,一般是看不上微信号的,感觉没什么技术含量,或者说没什么技术壁垒.也有另一批人观点相反的 ...
- 3D游戏中的画质与效率适配
哪里来的需求? 众所周知,由于不同的设备配置不同.导致其CPU和GPU处理能力有高有低.同样的游戏想要在所有设备上运行流畅且画面精美,是不可能的.这就需要我们针对不同的设备能力进行画质调节,以保证 ...
- php缓冲区详解
什么是缓冲区(buffer)? 简单而言,缓冲区的作用就是,把输入或者输出的内容先放进内存,而不显示或者读取.至于为什么要有缓冲区,这是一个很广泛的问题,如果有兴趣,可以在网山找下资料. 其实缓冲区最 ...
- Fiddler--一、HTTP协议简介
在学习Fiddler之前,最好先学习一下HTTP协议. HTTP协议简介 什么是HTTP协议 超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端 ...
- Enterprise Solution 开源项目资源汇总 Visual Studio Online 源代码托管 企业管理软件开发框架
Enterprise Solution 是一套管理软件开发框架,在这个框架基础上开发出一套企业资源计划系统Enterprise Edition. 现将Enterprise Solution开发过程中遇 ...
- NotePad++中JSLint的使用
1.第一步下载Notepad++ 2.安装JSLint插件 3.运行JSlint 4.前提是你设置了当前语言或者本身文件就是js 5.JSLint的作用主要就是检查你的JS的规则正确性(至少是绝大部分 ...
- 前端学HTTP之数据传输
× 目录 [1]客户机处理 [2]集线器处理 [3]路由器1处理[4]路由器2处理[5]交换机处理[6]服务器处理[7]反向传输 前面的话 上一篇中,介绍了网络基础.本文将详细介绍客户机在浏览网页ab ...
- 手动制作微信h5分享活动页面
现在网上有很多自动制作h5宣传页的网站,可以通过传图,点几下鼠标就可以制作一个集动画.生产二维码等各种功能于一身的h5微信宣传页.对于运营来讲,非常方便,没有技术门槛,不足之处就是只有特定的动画效果, ...
- 【分布式】Zookeeper与Paxos
一.前言 在学习了Paxos在Chubby中的应用后,接下来学习Paxos在开源软件Zookeeper中的应用. 二.Zookeeper Zookeeper是一个开源的分布式协调服务,其设计目标是将那 ...