看看C 6 0中那些語法糖都幹了些什麼(終結篇)

2021-07-29 08:28:07 字數 2721 閱讀 7790

終於寫到終結篇了,整個人像在夢遊一樣,說完這一篇我得繼續寫我的js系列啦。

一:帶索引的物件初始化器

還是按照江湖老規矩,先扒開看看到底是個什麼玩意。

1

static

void main(string

args)2;

8 }

第一眼看到這個還是蠻新鮮的,不過轉眼就能想到是不是跟陣列初始化器,物件初始化器乙個樣?你要是這麼想就對了,下面我們來看看這玩意會生成

什麼樣的il。

從上圖中可以清楚的看到set_item方法,這個方法就是編譯器上層的索引器語法糖,就是忽悠我們提高開發效率的,不過也還行,起碼讓我少輸入了

兩個dic,然後把**還原如下:

1             dictionary dic = new dictionary();

2 dic["

name

"] = "

ctrip";

3 dic["

age"] = "

20";

索性趁熱打鐵,看看這個索引器方法的內部**是什麼樣的,從下圖中可以看到是乙個insert操作。

二:無引數的結構體建構函式

不知道有多少人知道值型別在c#6.0之前是絕對不可以定義預設建構函式的,為什麼這麼說呢?道理很簡單,因為值型別和引用型別的機制不一樣,

值型別不需要new就可以在棧中分配空間,比如下面的結構體point,只要我們定義了,就可以方便的使用point.x值。

那問題來了,如果我定義了乙個預設的建構函式,並且在裡面寫下x=5,y=5,那誰可以告訴我,當我定義point的時候,有沒有呼叫建構函式呢???

1

using

system;

2using

system.collections.generic;

3using

system.linq;

4using

system.text;

5using

system.threading.tasks;

6using

system.console;78

namespace918

}1920public

class

test

2124

25public

struct

point

2636

}37 }

如果執行了預設建構函式,那我point.x的時候會輸出5,是不是覺得有點奇怪呢?所以基於這個原因,c#6.0之前為了避嫌,就禁止了這種預設的值

型別構造形式。但是這次在c#6.0中居然放開了,所以我就很迫不及待的去看一看到底調沒呼叫預設建構函式,如下圖:

從圖中看到並沒有呼叫預設建構函式,到這裡我也知道了,只有在我new的時候才會呼叫,所以我就發現,值型別是在模仿引用型別的使用方式了,

個人感覺真的沒有必要放開這個限制。

三:異常篩選器

c#6.0中這個異常篩選器還真是個比較新奇的東西,不看不知道,一看嚇一跳,比如下面的**。

1

public

void

run()26

catch

(exception ex)

7if (ex.message.contains("

timeout"))

811 }

如果你仔細看的話,好像就是乙個catch中省略了{}而已嘛?並沒有看到什麼其他特殊的東西,然後我就非常好奇的把上面的**恢復到6.0版本之前,

**如下:

1

public

void

run1()27

catch

(exception ex)813

}14 }

接來下,我們就來看看這兩份**的il到底會是個什麼樣子?內心狂雞凍啊,啊啊啊啊啊啊啊。。。。都痙攣了。。。。。

可以看到,上面兩份貌似相同的**,其實生成的il還是有很大區別的,新版**中會用isinst判斷是否為exception的例項,並且用brtrue來判斷當前是否

為null,如果是null,則不會執行ex.message.contains("timeout")語句了。但是老版**並沒有true/false判斷,還是按照常規執行,所以現在可以知道,

其實並不是簡單的省略了個"{}"大括號,這個語法糖在底層還是有些智慧型判斷的。

好了,所有的c#6.0的語法糖分析到這裡就結束了,感謝大家的關注。

看看C 6 0中那些語法糖都幹了些什麼(中篇)

一 字串嵌入值 我想string.format方法就是化成灰大家都認識,比如下面 1 class bird2 name 8 9 這個format有乙個不好的地方就是,如果佔位符太多,就特別容易搞錯,如果你少了乙個引數,就會報錯。因為容易報錯,所以為了保險起見就用字串拼接的方式來實現,但是我也知道字串...

看看C 6 0中那些語法糖都幹了些什麼(上篇)

今天沒事,就下了個vs2015 preview,前段時間園子裡面也在熱炒這些新的語法糖,這裡我們就來看看到底都會生成些什麼樣的il?一 自動初始化屬性 確實這個比之前的版本簡化了一下,不過你肯定很好奇,到底編譯器給我們做了哪些東西呢?從這張圖中可以看到,在ctor中k backingfield ct...

看看C 6 0中那些語法糖都幹了些什麼(上篇)

今天沒事,就下了個vs2015 preview,前段時間園子裡面也在熱炒這些新的語法糖,這裡我們就來看看到底都會生成些什麼樣的il?一 自動初始化屬性 確實這個比之前的版本簡化了一下,不過你肯定很好奇,到底編譯器給我們做了哪些東西呢?從這張圖中可以看到,在ctor中k backingfield ct...