C# 7.0新功能
下面是對C#7.0 版本所有語言功能的描述。隨著?Visual Studio “15” preview 4?的發布,大部分功能可以被更靈活的應用。現在正是時候將這些功能介紹給大家,你也可以借此讓我們知道你的想法。
C#7.0 增加了很多新的功能,更專注于數據的消費,代碼的簡化及代碼的性能。或許最大的功能就是元組和模式匹配,它可以快速獲得多個返回結果,而模式匹配,它可以根據數據的“形”的不同來簡化代碼。我們希望將它們結合起來,從而使你的代碼更加簡潔高效,也可以使你更加快樂并富有成效。您可以點擊 Visual studio 窗口頂部的“send feedback”按鈕來告訴我們是否有哪些功能沒有達到預期的功效,也可以告訴我們您對功能進一步改善的一些看法。還有許多功能沒有在 Preview 4 中實現。我們計劃在最終版本發布下面所描述的功能,如果我們不能及時發布這些功能,會在 notes 上通知大家的。如果這些功能有變化,我們也會通知大家的。最終可能會有一些功能的改變和刪除。
如果你對這些功能的設計過程感興趣,你可以在 Roslyn GitHub site 上查看我們的設計筆記和討論。
希望你對C#7.0 有一個愉快的體驗。
輸出變量:
在當前的 C# 版本,使用 out 參數可能不像我們想的那樣方便。在你調用一個帶有 out 參數的方法之前,你必須首先聲明一個變量并傳遞給它。你通常不會初始化這些變量(畢竟它們會被方法重寫),也不能用 var 去聲明他們,而是必須指定數據的完整類型。
在C#7.0 版本中,我們添加了 out 變量,可以在給一個函數傳入參數的時候再去定義變量的能力。
變量的作用域是一個封閉的塊,因此后續的代碼行也可以使用它們。大多數類型的語句都沒有它們自己的作用域,因此被聲明的 out 參數通常被引入到封閉的范圍內。
注:在 Preview 4 中,適用范圍規則有了更多的限制:out 參數的作用域是聲明它的語句。因此,上面那個例子只有在下一次發布的時候才能真正使用。
因為 out 變量會直接被當做 out 參數來聲明,這樣編譯器通常會告訴他們應該是的類型(除非它們被重載),所以我們可以用 VAR 來定義,而不必使用真正的類型。
Out 參數的一種常見用法是 Try…模式, 其中一個布爾返回值表示成功,out 參數會攜帶所獲得的結果:
注:這里的i僅僅在 if 分支中會用到,所以 Preview 4 可以很好的處理這種情況。
我們還可以使用通配作為 out 參數,用*的形式來處理,這樣你就可以不必關注你不想關注的返回值了。
注:我們還不確定在C# 7.0 是否可以使用通配符。
模式匹配
C# 7.0 引入了模式的概念,抽象的講,模式是語法元素,能用來測試一個數據是否具有某種“形”,并且在它被使用的時候從中提取信息。
C# 7.0 中的模式示例:
C形式的常量模式(C是 C# 中的常量表達式),我們可以驗證輸入是否等于C
TX 形式的類型模式(T是一種類型,X 是一個標識符)。
Var x 形式的 Var 模式 (x是一個標識符)。
這僅僅是一個開始,模式是 C# 中的一個新語言元素,我們希望未來在 C# 中會有更多類型的模式。
在C# 7.0 中,我們改進了兩種已經存在的模式語法設計:
is 表達式的右值也可以是模式,而不僅僅只能是一種類型。
switch 中的 case 分支,也可以匹配模式,而不僅僅是常量了。
在未來,我們會增加更多模式的使用。
使用模式 IS 的表達式
下面是一個使用 Is 表達式的例子,用到了常量模式和類型模式。
正如你所看到的,模式變量(模式引入的變量)很像之前說過的輸出變量,可以在表達式中聲明,并且在最近的定義域中使用。就像輸出變量一樣,模式變量是可變的。
注:像輸出變量(out variables)一樣,我們會在 Preview 4 給出更加嚴謹的規則。
模式和 Try 方法一起用也是可以的。
帶模式的 Switch 語句
我們正在歸納總結這些 switch 語句,因此:
你可以在任何類型上使用 switch(不僅僅是原始類型)
可以在 case 子句中使用模式
Case 子句可以擁有額外的條件
下面是一個例子
關于新擴展的 switch 語句,有幾點需要注意:
Case 子句的順序現在很重要:就像 catch 子句,case 子句不再是必然不相交的,第一個子句匹配的將被選擇。
默認子句總是最后被判斷:即使上面代碼中 null 子句是最后才來,它會在默認子句被選擇前被檢查。這是為了與現有 switch 語義相兼容。然而,好的做法通常會讓你把默認子句放到最后。
Switch 不會到最后的 null 語句:這是因為當前 IS 表達式的例子具有類型匹配,不會匹配到 null。 這保證了空值不會不小心被任何的類型模式匹配上的情況; 你必須更明確如何處理它們(或放棄它而使用默認語句)。
元組
這是一個從方法中返回多個值的常見模式。目前可用的選項并不是最理想的:
輸出參數。使用笨拙(即便有上面描述到的改進),它們在使用異步方法時不起作用。
System.Tuple<…>返回類型。使用繁瑣并且需要分配一個元組對象。
方法的定制傳輸類型:對于類型,具有大量的代碼開銷,其目的僅是暫時將一些值組合起來。
通過動態返回類型返回匿名類型。高的性能開銷,而且沒有靜態類型檢查。
為了在這方面做得更好,C# 7.0 添加了元組類型和元組文字:
這個方法可以有效地返回三個字符串,將其作為元素包含在一個元組值里。
方法的調用者將會接收到一個元組,并且可以單獨地訪問其中的元素:
Item1 等是元組元素的默認名,并能夠一直使用。但它們不具有描述性,因此你可以選擇添加更好的。
現在元組的接收者有多個具有描述性的名稱可用:
你也可以在元組文字中直接指定元素名稱:
通常來說,你可以給元組類型分配相互無關的名字,只要獨立的元素是可以被分配的,元組類型會自如轉換成其他元組類型。但是也存在一些限制,特別是對于元組文字,會在常見的錯誤情況下警告或提示,例如偶然交換元素的名字。
注:這些限制還沒在 Preview 4 中實現 。
元組是值類型,而且他們的元素是公開的、可變的。兩個元組相等(并且有相同的哈希值),意味著它們的元素都是成對匹配的(并且有相同的哈希值)。
這使得元組對于在需要多個返回值的情況下非常有用。舉例來說,如果你需要一個有多種鍵的詞典,使用元組作為你的鍵,一切會非常順利。如果你需要在每個位置有多種值的列表,使用元組進行列表搜索,程序會正常運行。
注:元組依賴于一組基本類型,它們還沒包括在 Preview 4 中。為了使該特性工作,你可以通過 NuGget 獲取它們:
在 Solution Explorer 中右鍵點擊項目,并選擇“管理 NuGet 包…”
選擇“Browse”選項卡,選中“Include prerelease” ,選擇“nuget.org”作為“Package source”
搜索“System.ValueTuple”并安裝它
Deconstruction 解構
消耗元組的另一種方法是解構元組。解構聲明是一種將元組拆分,并單獨分配到新變量的語法:
在解構中可采用 var 關鍵字來聲明單獨的變量:
或者把 var 關鍵字提取出來放在括號外:
你也可以通過解構賦值來解構成一個現有變量:
解構不僅僅適用于元組。任何類型都可以被解構,只要它有一個對應的(實例或擴展)解構方法:
輸出參數由結構產生的值構成。
(為何它使用了參數,而不是返回一個元組?這是為了讓你可以針對不同的值擁有多個重載)。
構造函數和解構函數以對稱方式出現是一種常見的模式。
至于輸出變量,我們計劃在解構中使用“通配符”,來化簡你不關心的那些變量:
注:現在仍然不能確定通配符是否會出現在C#7.0 中。
局部函數
有時,一個輔助函數只在一個使用它的單一方法的內部有意義。現在你可以在其他功能體內部以一個局部函數來聲明這樣的函數:
閉合范圍內的參數和局部變量在局部函數內是可用的,就像他們在 lambda 表達式中一樣。
舉個例子,迭代的方法實現通常需要一個非迭代的封裝方法,以便在調用時檢查實參。(迭代器本身不能啟動,直到調用 MoveNext 才會運行)。局部函數非常適合這樣的場景:
如果 Iterator 是緊隨 Filter 的一個私有方法,它將有可能被其他成員不小心使用(不需要參數檢查)。此外,它將采取所有跟 Filter 里相同的參數,而不是指定域內的參數。
注:在 Preview 4 版本中,局部函數必須在它們被調用之前聲明。這個限制將被放松,能調用讀取直接賦值的局部變量。
文字改進
C#7.0 允許用”_”作為數字分隔符:
你可以把它們放在任意的數字之間,以提高可讀性。這對數值沒有影響。
另外,C # 7 引進了二進制數,因此,您可以直接指定二進制模式,而不需要知道十六進制符號。
引用返回和局部引用
就像在C#中你可以通過引用(用 ref 修飾符)傳遞參數,你現在也可以通過引用來返回參數,并通過引用將它們存儲在局部變量中。
這個是非常有用的。例如,一個游戲可能會將它的數據保存在一個大的預分配數組結構中(為避免垃圾回收機制暫停)。這個方法可以直接返回一個引用到這樣一個結構,且通過調用者可以讀取和修改它。
為確保安全,也有以下一些限制:
你只能返回”安全返回”的引用:一個是傳遞給你的引用,一個是指向對象中的引用
本地引用會被初始化成一個本地存儲,并且不能指向另一個存儲
異步返回類型
到目前為止,在C#的異步方法必須返回 void,Task 或 Task<T>。C#7.0 允許以這樣的方式來定義其它類型,從而使它們可以從異步方法返回。
例如,我們計劃建立一個 ValueTask<T>結構類型的數據。建立它是為了防止 Task<T> 對象的分配時,異步操作的結果在等候是已可用。對于很多異步場景,比如以涉及緩沖為例,這可以大大減少分配的數量,并使性能有顯著提升。
注:異步返回類型尚未在 Preivew4 中提供。
更多 Expression-bodied 成員
Expression-bodied 的方法、屬性等都是C# 6.0 的重大突破,但是不是所有的成員都可以使用的。 C#7.0 添加了訪問器、構造函數和終結器等,使更多成員可以使用 Expression-bodied 方法:
注:這些額外的 Expression-bodied 成員尚未在 Preview4 中提供。
這是一個由社區共享的示例,而非微軟 C# 團隊提供的,它是開源的!
Throw?表達式
在表達式中間拋出一個異常是很容易的:只要調用一個方法!但在 C # 7.0 中,我們允許在一些地方直接拋出一個表達式:
注:Throw 表達式尚未在 Preview 4 中提供。
原文地址:https://news.cnblogs.com/n/561619/
.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注
總結
- 上一篇: 红包的技术升级之旅
- 下一篇: look look C#7