终于写到终结篇了,整个人像在梦游一样,说完这一篇我得继续写我的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中那些语法糖都干了些什么(终结篇)的更多相关文章

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

    接着上篇继续扯,其实语法糖也不是什么坏事,第一个就是吃不吃随你,第二个就是最好要知道这些糖在底层都做了些什么,不过有一点 叫眼见为实,这样才能安心的使用,一口气上五楼,不费劲. 一:字符串嵌入值 我想 ...

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

    今天没事,就下了个vs2015 preview,前段时间园子里面也在热炒这些新的语法糖,这里我们就来看看到底都会生成些什么样的IL? 一:自动初始化属性 确实这个比之前的版本简化了一下,不过你肯定很好 ...

  3. js中的new关键字都干了些什么?

    new 操作符 在有上面的基础概念的介绍之后,在加上new操作符,我们就能完成传统面向对象的class + new的方式创建对象,在javascript中,我们将这类方式成为Pseudoclassic ...

  4. Java 中的语法糖

    百度百科对语法糖的定义 语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这 ...

  5. [转]谈谈Java中的语法糖

    *该博客转自 http://blog.csdn.net/danchu/article/details/54986442 语法糖(Syntactic Sugar),也称糖衣语法,指在计算机语言中添加的某 ...

  6. JVM(二):Java中的语法糖

    JVM(二):Java中的语法糖 上文讲到在语义分析中会对Java中的语法糖进行解糖操作,因此本文就主要讲述一下Java中有哪些语法糖,每个语法糖在解糖过后的原始代码,以及这些语法糖背后的逻辑. 语法 ...

  7. 浅析java中的语法糖

    概述 编译器是一种计算机程序, 它主要的目的是将便于人编写.阅读.维护的高级计算机语言所写的源代码程序, 翻译为计算机能解读.运行的低阶机器语言的程序, 即可执行文件.而 javac 就是java语言 ...

  8. 【Java基础】Java中的语法糖

    目录 Java中的语法糖 switch对String和枚举类的支持 对泛型的支持 包装类型的自动装箱和拆箱 变长方法参数 枚举 内部类 条件编译 断言 数值字面量 for-each try-with- ...

  9. C# 6.0新特性---语法糖

    转载:http://www.cnblogs.com/TianFang/p/3928172.html 所谓语法糖就是在编译器里写做文章,达到简化代码书写的目的,要慎重使用,省略过多不易理解. NULL检 ...

随机推荐

  1. Web应用多账号系统设计及微信扫码登录实现

    Web应用多账号系统设计及微信扫码登录实现 1   前言概述 公司对功能测试,性能测试,安全测试等等都做了比较好的自动化后,急需要一个MIS系统来统一管理这些结果及报表. 此MIS系统特点如下: 仅内 ...

  2. Java 开发主流 IDE 环境体验

    前言 本来应该继续从 Oracle 官网搬砖的,但是随着示例代码越来越复杂,涉及的类库越来越多,使用 Vim 写 Java 代码就很力不从心了,是时候上 IDE 了.我最熟悉的 IDE 环境是 Ecl ...

  3. With(ReadPast)就不会被阻塞吗?

    在生产环境中,会有很多使用ReadPast查询提示的场合,来避免正在被其它事务锁定的行对当前查询造成阻塞,而又不会获取到“脏数据”. 可是很多人都疑惑,为什么我使用了ReadPast仍然有时会被阻塞? ...

  4. ABP(现代ASP.NET样板开发框架)系列之4、ABP模块系统

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之4.ABP模块系统 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...

  5. iOS 之消息推送(个推)---个人小结

    前言:自从上个星期开始整这个推送,弄了差不多一个星期,今天终于给整好了,因此现在来记录这段"奇妙"的旅程. 我们公司使用的消息推送是用的第三方--个推,这里不得不说一下,个推的技术 ...

  6. web标准之道——笔记

    字体设置 sans和sans-serif为通用字体,具体哪个字体被最终应用由浏览器决定,通用字体只有在其他字体都无效时才会被当作代替方案.通用字体应该放在最后面 sans衬线字体 容易阅读,一般使用在 ...

  7. discuz接入七牛sdk

    自己摸索了几天,找群里面的人各种问,都没有一个人回答我,哎,国内的开源精神呢...... 需要修改有以下几个: 1.替换 /source/class/class_core.php 文件   解释:就 ...

  8. Geotrellis系列文章链接

    本文存放了我在博客园中撰写的Geotrellis系列文章链接,方便查阅! 一.geotrellis使用初探 二.geotrellis使用(二)geotrellis-chatta-demo以及geotr ...

  9. Android属性动画

    这几天看郭神的博客 Android属性动画完全解析(上),初识属性动画的基本用法之后,我自己突然想实现一种动画功能,就是我们在携程网.阿里旅行等等手机APP端买火车票的时候,看到有选择城市,那么就有出 ...

  10. 【NLP】大数据之行,始于足下:谈谈语料库知多少

    大数据之行,始于足下:谈谈语料库知多少 作者:白宁超 2016年7月20日13:47:51 摘要:大数据发展的基石就是数据量的指数增加,无论是数据挖掘.文本处理.自然语言处理还是机器模型的构建,大多都 ...