探索C#之6.0語(yǔ)法糖剖析

自動(dòng)屬性默認(rèn)初始化

使用方法:

public string Name { get; set; } = "Hello World";

編譯器生成代碼:

public class Customer 
{
 [CompilerGenerated] 
private string kBackingField = "<span style="color: #993300;">hello world</span>"; 
public Customer() 
{ 
this.kBackingField = "hello world"; 
}
 
public string Name
{
    [CompilerGenerated]
    get
    {
        return this.<Name>k__BackingField;
    }
    [CompilerGenerated]
    set
    {
        this.<Name>k__BackingField = value;
    }
}
}

從生成代碼中可以看出編譯器是在實(shí)例化構(gòu)造函數(shù)時(shí)蜀肘,初始化屬性信息的。

自動(dòng)只讀屬性默認(rèn)初始化

使用方法:

public string Name1 {get;} = "hello world";

編譯器生成代碼:

public class Customer 
{
 [CompilerGenerated] 
private string kBackingField = "hello world"; 
public Customer() 
{ 
this.kBackingField = "hello world"; 
}
 
public string Name
{
    [CompilerGenerated]
    get
    {
        return this.<Name>k__BackingField;
    }
    [CompilerGenerated]
    set
    {
        this.<Name>k__BackingField = value;
    }
}
}

從生成的代碼中也可以看到編譯器是在實(shí)例化構(gòu)造函數(shù)時(shí)柒巫,初始化屬性信息的。

表達(dá)式為主體的函數(shù)

使用方法:

Body Get(int x, int y) => new Body(1 + x, 2 + y);

編譯器生成代碼:

private Program.Body Get(int x, int y)
{
      return new Program.Body(1+x, 2+y);
}

從生成的代碼中可以看到簡(jiǎn)化了單選方法的編寫蚌吸,省去寫大括號(hào)的功夫类少。
同時(shí)也支持沒(méi)有返回值的寫法:

void OutPut(int x, int y) => Console.WriteLine("hello, world");

也支持異步函數(shù)的編寫:

async void OutPut(int x, int y) => await new Task(() => Console.WriteLine("hello world"));

表達(dá)式為主體的屬性(賦值)

使用方法:

public string Name2 => "hello world";

編譯器生成代碼如下:

public string Name2
{
     get { return "hello world"; }
}

編譯器只生成了個(gè)只讀屬性

靜態(tài)類導(dǎo)入

這個(gè)比較容易理解,就是一次性導(dǎo)入某類型的所有靜態(tài)成員,然后在后面的代碼中直接使用召嘶,比如:

using static System.Console;
class Program
{
      static void Main(string[] args}
      {
            WriteLine("hello world");
      }
}

Null 條件運(yùn)算符

使用方法:

Customer cust = new Customer();
if (cust != null)
{
      string name = cust.Name;
}

等同于:

Customer cust = new Customer();
string name = cust?.Name;

可以和父晶??組合起來(lái)使用:

if (customer?.Face()?? false)

還可以2個(gè)一起用

int? Length = customer?.Name?.Length;

這個(gè)語(yǔ)法糖目的是在對(duì)象使用前檢查是否為null弄跌,如果對(duì)象為空,則賦值給變量為宿舍尝苇,所以例子中需要一個(gè)可以為空的Int類型铛只,即int?
如果對(duì)象不為空,則調(diào)用對(duì)象的成員取舍糠溜,并賦值給變量

字符串格式化

在下面的例子中淳玩,String.Format 有些不方便的地方是:必須輸入“String.Format", 使用{0}點(diǎn)位符,必須按順序來(lái)格式化非竿,這點(diǎn)比較容易出錯(cuò):

var s = String.Format("{0} is {1} year old", p.Name, p.Age);

新的語(yǔ)法糖可以這么使用:

var s = $"{p.Name} is {p.Age} year old";

比較有趣的是蜕着,新格式方法還支持任何表達(dá)式的直接賦值:

var s = $"{p.Name} is {p.Age} year{(p.Age == 1 ? "" : "s")} old";

索引的初始化

使用List時(shí),雖然可以通過(guò)下面的方式書寫红柱,可以編譯通過(guò)承匣,但還是會(huì)拋異常,使用方法:

var numbers = new List<string> { [7] = "seven", [9] ="nine", [13] ="thirteen"};

編譯器生成代碼:

List list = new List(); 
list[7] = "seven";
 list[9] = "nine"; 
list[13] = "thirteen";

Dictionary 可以執(zhí)行锤悄,因?yàn)槎邇?nèi)部索引機(jī)制不一樣:

var numbers = new Dictionary<int, string> {[7] = "seven",[9] = "nine",[13] = "thirteen";

異常過(guò)濾器 when

使用方法:

try
{ 
throw new ArgumentException("string error");
 }
 catch (ArgumentException e) when (myfilter(e))
 { 
Console.WriteLine(e.Message);
 }
 
static bool myfilter(ArgumentException e)
 { 
return false;
 }

When語(yǔ)法作用是:在進(jìn)入到catch之前韧骗、驗(yàn)證when括號(hào)里myfilter方法返回的bool,如果返回true繼續(xù)運(yùn)行零聚,false不走catch直接拋出異常袍暴。

使用這個(gè)filter可以更好的判斷一個(gè)錯(cuò)誤是繼續(xù)處理還是重新拋出去。按照以前的做法隶症,在catch塊內(nèi)如需再次拋出去政模,需要重新throw出去,這時(shí)的錯(cuò)誤源是捕捉后在拋的蚂会,而不是原先的淋样,有了when語(yǔ)法就可以直接定位到錯(cuò)誤源。

nameof表達(dá)式

有時(shí)候會(huì)需要程序中一些成員的字符串名稱颂龙,比如拋出ArgumentNullException異常的時(shí)候习蓬,想知道ArgumentNullException類型的字符串名稱,這時(shí)候就可以用nameof獲取字符

串“ArgumentNullException”〈肭叮現(xiàn)在做法都是手動(dòng)復(fù)制一下躲叼,但重構(gòu)改名的時(shí)候容易忘記變更字符串,使用nameof就可以避免了企巢。

string name = "";
Console.WriteLine(nameof(name));
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末枫慷,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌或听,老刑警劉巖探孝,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異誉裆,居然都是意外死亡顿颅,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門足丢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)粱腻,“玉大人,你說(shuō)我怎么就攤上這事斩跌∩苄” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵耀鸦,是天一觀的道長(zhǎng)柬批。 經(jīng)常有香客問(wèn)我,道長(zhǎng)袖订,這世上最難降的妖魔是什么氮帐? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮著角,結(jié)果婚禮上揪漩,老公的妹妹穿的比我還像新娘。我一直安慰自己吏口,他們只是感情好奄容,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著产徊,像睡著了一般昂勒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舟铜,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天戈盈,我揣著相機(jī)與錄音,去河邊找鬼谆刨。 笑死塘娶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的痊夭。 我是一名探鬼主播刁岸,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼她我!你這毒婦竟也來(lái)了虹曙?” 一聲冷哼從身側(cè)響起迫横,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎酝碳,沒(méi)想到半個(gè)月后矾踱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疏哗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年呛讲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片返奉。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡圣蝎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出衡瓶,到底是詐尸還是另有隱情,我是刑警寧澤牲证,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布哮针,位于F島的核電站,受9級(jí)特大地震影響坦袍,放射性物質(zhì)發(fā)生泄漏十厢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一捂齐、第九天 我趴在偏房一處隱蔽的房頂上張望蛮放。 院中可真熱鬧,春花似錦奠宜、人聲如沸包颁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)娩嚼。三九已至,卻和暖如春滴肿,著一層夾襖步出監(jiān)牢的瞬間岳悟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工泼差, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贵少,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓堆缘,卻偏偏與公主長(zhǎng)得像滔灶,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子套啤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容