看看C# 6.0中那些语法糖都干了些什么(终结篇)
终于写到终结篇了,整个人像在梦游一样,说完这一篇我得继续写我的js系列啦。
一:带索引的对象初始化器
还是按照江湖老规矩,先扒开看看到底是个什么玩意。

- 1 static void Main(string[] args)
- 2 {
- 3 Dictionary<string, string> dic = new Dictionary<string, string>()
- 4 {
- 5 ["Name"] = "ctrip",
- 6 ["Age"] = "15"
- 7 };
- 8 }

第一眼看到这个还是蛮新鲜的,不过转眼就能想到是不是跟数组初始化器,对象初始化器一个样?你要是这么想就对了,下面我们来看看这玩意会生成
什么样的IL。
从上图中可以清楚的看到set_Item方法,这个方法就是编译器上层的索引器语法糖,就是忽悠我们提高开发效率的,不过也还行,起码让我少输入了
两个dic,然后把代码还原如下:
- 1 Dictionary<string, string> dic = new Dictionary<string, string>();
- 2 dic["Name"] = "ctrip";
- 3 dic["Age"] = "20";
索性趁热打铁,看看这个索引器方法的内部代码是什么样的,从下图中可以看到是一个Insert操作。
二:无参数的结构体构造函数
不知道有多少人知道值类型在C#6.0之前是绝对不可以定义默认构造函数的,为什么这么说呢?道理很简单,因为值类型和引用类型的机制不一样,
值类型不需要new就可以在栈中分配空间,比如下面的结构体Point,只要我们定义了,就可以方便的使用point.X值。
那问题来了,如果我定义了一个默认的构造函数,并且在里面写下x=5,y=5,那谁可以告诉我,当我定义point的时候,有没有调用构造函数呢???

- 1 using System;
- 2 using System.Collections.Generic;
- 3 using System.Linq;
- 4 using System.Text;
- 5 using System.Threading.Tasks;
- 6 using System.Console;
- 7
- 8 namespace ConsoleApplication3
- 9 {
- 10 class Program
- 11 {
- 12 static void Main(string[] args)
- 13 {
- 14 Test t = new Test();
- 15 var s = t.point.X; //请问有没有调用构造函数啊?啊啊啊啊啊。。。。。。。。。。。。。。。
- 16 Console.Read();
- 17 }
- 18 }
- 19
- 20 public class Test
- 21 {
- 22 public Point point;
- 23 }
- 24
- 25 public struct Point
- 26 {
- 27 public int X;
- 28
- 29 public int Y;
- 30
- 31 public Point()
- 32 {
- 33 X = 5;
- 34 Y = 5;
- 35 }
- 36 }
- 37 }

如果执行了默认构造函数,那我point.X的时候会输出5,是不是觉得有点奇怪呢?所以基于这个原因,C#6.0之前为了避嫌,就禁止了这种默认的值
类型构造形式。但是这次在C#6.0中居然放开了,所以我就很迫不及待的去看一看到底调没调用默认构造函数,如下图:
从图中看到并没有调用默认构造函数,到这里我也知道了,只有在我new的时候才会调用,所以我就发现,值类型是在模仿引用类型的使用方式了,
个人感觉真的没有必要放开这个限制。
三:异常筛选器
C#6.0中这个异常筛选器还真是个比较新奇的东西,不看不知道,一看吓一跳,比如下面的代码。

- 1 public void Run()
- 2 {
- 3 try
- 4 {
- 5 }
- 6 catch (Exception ex)
- 7 if (ex.Message.Contains("timeout"))
- 8 {
- 9 throw;
- 10 }
- 11 }

如果你仔细看的话,好像就是一个catch中省略了{}而已嘛?并没有看到什么其他特殊的东西,然后我就非常好奇的把上面的代码恢复到6.0版本之前,
代码如下:

- 1 public void Run1()
- 2 {
- 3 try
- 4 {
- 5
- 6 }
- 7 catch (Exception ex)
- 8 {
- 9 if (ex.Message.Contains("timeout"))
- 10 {
- 11 throw;
- 12 }
- 13 }
- 14 }

接来下,我们就来看看这两份代码的IL到底会是个什么样子?内心狂鸡冻啊,啊啊啊啊啊啊啊。。。。都痉挛了。。。。。
可以看到,上面两份貌似相同的代码,其实生成的IL还是有很大区别的,新版代码中会用isinst判断是否为Exception的实例,并且用brtrue来判断当前是否
为null,如果是null,则不会执行ex.Message.Contains("timeout")语句了。但是老版代码并没有true/false判断,还是按照常规执行,所以现在可以知道,
其实并不是简单的省略了个"{}"大括号,这个语法糖在底层还是有些智能判断的。
好了,所有的C#6.0的语法糖分析到这里就结束了,感谢大家的关注。
看看C# 6.0中那些语法糖都干了些什么(终结篇)的更多相关文章
- 看看C# 6.0中那些语法糖都干了些什么(中篇)
接着上篇继续扯,其实语法糖也不是什么坏事,第一个就是吃不吃随你,第二个就是最好要知道这些糖在底层都做了些什么,不过有一点 叫眼见为实,这样才能安心的使用,一口气上五楼,不费劲. 一:字符串嵌入值 我想 ...
- 看看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检 ...
随机推荐
- CSharpGL(9)解析OBJ文件并用CSharpGL渲染
CSharpGL(9)解析OBJ文件并用CSharpGL渲染 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo ...
- JavaScript之web通信
web通信,一个特别大的topic,涉及面也是很广的.因最近学习了 javascript 中一些 web 通信知识,在这里总结下.文中应该会有理解错误或者表述不清晰的地方,还望斧正! 一.前言 1. ...
- ABP框架 - 日志
文档目录 本节内容: 服务端 获取Logger(记录器) Logger的基类 配置 Abp.Castle.Log4Net 包 客户端 服务端 ABP使用Castle Windsor的日志记录工具,它可 ...
- Oracle ------ SQLDeveloper中SQL语句格式化快捷键
Oracle SQL Developer中SQL语句格式化快捷键: 每次sql复制到SQL Developer面板的时候,格式老不对,而且看起来很不舒服,所有的sql都挤在一行完成. 这时我们可以全选 ...
- 使用python实现短信PDU编码
前几天入手一个3G模块,便倒腾了一下.需要发送中英文混合短信,所以采用PDU模式(不了解google ^_^). 最大问题当然就是拼接PDU编码(python这么强大,说不定有模块),果不其然找到一个 ...
- select,epoll,poll比较
介绍和比较 http://www.cnblogs.com/maociping/p/5132583.html 比较 http://www.dataguru.cn/thread-336032-1-1.ht ...
- Sql Server系列:SQL语句查询数据库中表、视图、存储过程等组成
1. 查看用户表 select name from sys.tables select name from sys.objects where type='U' select name from sy ...
- ISO日期格式标准,浏览器到服务器到mysql中的时区
时区简单理解 https://zh.wikipedia.org/wiki/%E6%97%B6%E5%8C%BA 上面的链接是时区的wiki说明,下面说说我记住的部分: GMT时区是格林威治标准时间,我 ...
- 重磅来袭,使用CRL实现大数据分库分表方案
关于分库分表方案详细介绍 http://blog.csdn.net/bluishglc/article/details/7696085 这里就不作详细描述了 分库分表方案基本脱离不了这个结构,受制于实 ...
- oracle的特殊权限s bit丢失
在SUN Cluster搭建过程中,主机工程师在配置集群资源组时报一个oracle的文件权限错误: 协助排查,发现报错很明确,直接指出说oracle的s bit 权限未设置. 直接去查看$ORACLE ...