C# 6.0语法新特性体验(二)
之前我在文章通過(guò)Roslyn體驗(yàn)C# 6.0的新語(yǔ)法中介紹了一些C# 6.0的語(yǔ)法特性,現(xiàn)在隨著Visual Studio 14 CTP3的發(fā)布,又陸續(xù)可以體驗(yàn)一些新的特性了,這里簡(jiǎn)單的介紹一下之前沒(méi)有介紹的新語(yǔ)法。
屬性表達(dá)式(Property Expressions)
我們常常會(huì)在類中寫(xiě)一些通過(guò)函數(shù)生成的只讀屬性:
????class Point
????{
????????public int X { get; set; }
????????public int Y { get; set; }
????????public Point(int x, int y)
????????{
????????????this.X = x;
????????????this.Y = y;
????????}
????????public double Distance
????????{
????????????get { return Math.Sqrt((X * X) + (Y * Y)); }
????????}
????????public Point Move(int dx, int dy)
????????{
????????????return new Point(X + dx, Y + dy);
????????}
????}
現(xiàn)在,可以利用一個(gè)Lambda表達(dá)式簡(jiǎn)化這一過(guò)程:
????????public double Distance => Math.Sqrt((X * X) + (Y * Y));
?
函數(shù)表達(dá)式(Method Expressions)
函數(shù)表達(dá)式和屬性表達(dá)式比較類似,使得我們可以通過(guò)Lambda表達(dá)式簡(jiǎn)化成員函數(shù)。還是以上面的Point為例,Move函數(shù)可以簡(jiǎn)化如下
????????public Point Move(int dx, int dy) => new Point(X + dx, Y + dy);
最后,再總結(jié)前文介紹的幾個(gè)新特性來(lái)一起來(lái)簡(jiǎn)化Point類:
????class Point(int x, int y)
????{
????????public int X { get; set; } = x;
????????public int Y { get; set; } = y;
????????public double Distance => Math.Sqrt((X * X) + (Y * Y));
????????public Point Move(int dx, int dy) => new Point(X + dx, Y + dy);
????}
??
NULL檢查運(yùn)算符(Monadic null checking)
這個(gè)是我非常喜歡的一個(gè)語(yǔ)法,例如我們要獲取一個(gè)Point序列的第一個(gè)點(diǎn)的X坐標(biāo),第一感覺(jué)會(huì)這么寫(xiě):
????int firstX = points.First().X;
但是,老鳥(niǎo)會(huì)告訴你,這兒沒(méi)有進(jìn)行NULL檢查,正確的版本是這樣的:
????int? firstX = null;
????if (points != null)
????{
????????var first = points.FirstOrDefault();
????????if (first != null)
????????????firstX = first.X;
????}
正確倒是正確了,代碼取變得難讀多了?,F(xiàn)在,在C# 6.0中,引入了一個(gè) ?. 的運(yùn)算符,前面的代碼可以改成如下形式:
????int? firstX = points?.FirstOrDefault()?.X;
從這個(gè)例子中我們也可以看出它的基本用法:如果對(duì)象為NULL,則不進(jìn)行后面的獲取成員的運(yùn)算,直接返回NULL
需要注意的是,由于"?."運(yùn)算符返回的可以是NULL,當(dāng)返回的成員類型是struct類型的時(shí)候,"?."和"."運(yùn)算符的返回值類型是不一樣的。
????Point p = new Point(3, 2);
????Console.WriteLine(p.X.GetType() == typeof(int));????????//true
????Console.WriteLine(p?.X.GetType() == typeof(int?));????????//true
另外,除了"?."運(yùn)算符外,還有一個(gè)"?[]"運(yùn)算符,以使得我們可以寫(xiě)出如下表達(dá)式:
????int? first = customers?[0].Orders.Count();
?
nameof表達(dá)式(Nameof expressions)
我們常常在反射或類似的技術(shù)中以字符串的形式使用屬性的名稱,拋開(kāi)拼寫(xiě)錯(cuò)誤不談,當(dāng)我們進(jìn)行重構(gòu)而修改屬性名稱的時(shí)候,由于字符串類型的屬性得不到編譯器檢查,修改相應(yīng)的字符串屬性名稱是一件非常令人頭痛的事情,現(xiàn)在有了nameof,再也不用擔(dān)心拼錯(cuò)屬性名稱了。
nameof運(yùn)算符可以作用于變量、函數(shù)、類以及名字空間中,用于返回返回其名稱,例如:
????static void Main(string[] args)
????{
????????Console.WriteLine(nameof(Main));????????//輸出 "Main"
????}
當(dāng)其參數(shù)是由"."運(yùn)算符拼接起來(lái)的時(shí)候,只返回最后的名稱,例如:
????Console.WriteLine(nameof(ConsoleApplication1.Program));????????//輸出 "Program"
這個(gè)也可以理解,因?yàn)?span style="color:#000000;">ConsoleApplication1.Program和Program本身就是等價(jià)的。
需要注意的是,由于C#允許函數(shù)重載,因此是存在同名函數(shù)的,例如:
????static void foo() { }
????static void foo(int x) { }
這樣就存在如下兩個(gè)問(wèn)題:
這兩個(gè)問(wèn)題只是體現(xiàn)在VisualStudio上,并不是語(yǔ)法的歧義,也不影響運(yùn)行結(jié)果。在CodePlex中也有專門(mén)的文章討論它,目前的處理方式是:
?
catch和finally語(yǔ)句塊中支持await
在C# 5.0中引入了await運(yùn)算符,可以方便我們執(zhí)行異步運(yùn)算。當(dāng)時(shí)其并不能在catch和finally中使用,讓人有點(diǎn)意猶未盡的感覺(jué)。在C# 6.0放開(kāi)了這一限制,使用更加方便了。
????try
????{
????????res = await Resource.OpenAsync(…);
????}
????catch (ResourceException e)
????{
????????await Resource.LogAsync(res, e);????//現(xiàn)在支持了
????}
????finally
????{
????????if (res != null) await res.CloseAsync(); //現(xiàn)在也支持了
????}
?
catch支持篩選條件了
catch支持篩選條件也是呼聲比較高的特性之一,現(xiàn)在終于可以省得重新再拋一次了
????try
????{
????????foo();
????}
????catch (Exception e ) if (e.HResult == 0x800000C)
????{
????????//do something
????}
?
其它未支持的特性
我這里只是介紹目前可以使用的新特性,我這里試出來(lái)的貌似可以補(bǔ)充的就這么多了。其它還有一些尚未推出的特性等下次有了更新的版本再做介紹。感興趣的朋友可以看看官方的特性實(shí)現(xiàn)狀態(tài)文檔:http://roslyn.codeplex.com/wikipage?title=Language%20Feature%20Status&referringTitle=Home。目前比較期待的新特性是String interpolation和模式匹配,尤其是模式匹配,希望能早日體驗(yàn)一下。
另外,目前還沒(méi)有發(fā)現(xiàn)什么BCL方面的更新介紹,雖然BCL已經(jīng)比較完善了,但感覺(jué)這次更新粒度蠻大的,估計(jì)至少會(huì)有一些基礎(chǔ)庫(kù)的補(bǔ)充的。
轉(zhuǎn)載于:https://www.cnblogs.com/TianFang/p/3928172.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的C# 6.0语法新特性体验(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 三维人脸重建:精读3dmm.py
- 下一篇: 基于ArcEngine与C#的鹰眼地图实