C# 7.1、7.2特性追踪
作為Visual Studio 15.3的一部分,微軟發布了自.NET 1.1以來C#的第一個單點版本。C# 7.1提供了三個新特性,其中有兩個是成功有效的。
\u0026#xD;\n\u0026#xD;\nC# 7.1/7.2:default字面量
\u0026#xD;\n\u0026#xD;\ndefault字面量旨在減少一些樣板代碼。下面是一個常見的例子:
\u0026#xD;\n\u0026#xD;\npublic Task\u0026lt;Order\u0026gt; GetOrderAsync(int orderKey, CancellationToken token = default(CancellationToken))\u0026#xD;\n\u0026#xD;\n\u0026#xD;\n這多少有點啰嗦,因此,模仿Visual Basic的Nothing關鍵字,上述代碼可以寫成下面這樣:
\u0026#xD;\n\u0026#xD;\npublic Task\u0026lt;Order\u0026gt; GetOrderAsync(int orderKey, CancellationToken token = default)\u0026#xD;\n\u0026#xD;\n\u0026#xD;\n這行代碼可以按照預期方式運行。但是,當使用一個可空的值類型時,問題就來了。
\u0026#xD;\n\u0026#xD;\npublic Task\u0026lt;Order\u0026gt; GetOrders(int? limit = default)\u0026#xD;\n\u0026#xD;\n\u0026#xD;\n這行代碼應該把limit參數置為空,但在C# 7.1中,它實際返回0。
\u0026#xD;\n\u0026#xD;\n這個問題的修復計劃在C# 7.2中進行,該版本會隨Visual Studio 15.5一起發布。
\u0026#xD;\n\u0026#xD;\nC# 7.1:元組名稱推斷\u0026#xD;\n\u0026#xD;\n
自從引入了匿名類型,C#就可以隱式命名屬性。例如,在下面這行代碼中,對象y會擁有名為A和B的屬性。
在C# 7.1中,值元組也具有這個特性。
\u0026#xD;\n\u0026#xD;\nvar z1 = (A: x.A, B: x.B); //顯式名稱\u0026#xD;\nvar z2 = (x.A, x.B); //推斷名稱\u0026#xD;\n\u0026#xD;\n\u0026#xD;\n要了解更多有關元組名稱推斷的信息,請看下我們之前的報道。
\u0026#xD;\n\u0026#xD;\nC# 7.1:Async Main
\u0026#xD;\n\u0026#xD;\n這里沒有多少可說的。Main函數現在可以異步執行,這減少了之前需要編寫的一些樣板代碼。
\u0026#xD;\n\u0026#xD;\nC# 7.2:條件Ref
\u0026#xD;\n\u0026#xD;\nC#的條件操作符通常被稱為“三元運算符”,因為這是這門語言中的唯一一個。C# 7.2將會提供第二個三元操作符,名為條件Ref操作符。
\u0026#xD;\n\u0026#xD;\n這個小特性讓開發人員可以在條件中使用ref表達式。下面是提案中的一個例子:
\u0026#xD;\n\u0026#xD;\nref var r = ref (arr != null ? ref arr[0]: ref otherArr[0]);\u0026#xD;\n\u0026#xD;\n\u0026#xD;\n注意,除了在靠近兩種可能結果的地方需要使用ref關鍵字外,在包含整個表達式的括號外也需要使用ref關鍵字。
\u0026#xD;\n\u0026#xD;\nC# 7.2:起始分隔符
\u0026#xD;\n\u0026#xD;\n該特性擴展了在數值字面量中使用下劃線的能力。下面的示例摘自提案:
\u0026#xD;\n\u0026#xD;\n123 // C# 1.0及更高版本可用\u0026#xD;\n\u0026#xD;\n1_2_3 // C# 7.0及更高版本可用\u0026#xD;\n0x1_2_3 // C# 7.0及更高版本可用\u0026#xD;\n0b101 // C# 7.0新增的二進制字面量\u0026#xD;\n0b1_0_1 // C# 7.0及更高版本可用\u0026#xD;\n\u0026#xD;\n// 在C# 7.2中,_可以用在`0x`或`0b`之后\u0026#xD;\n0x_1_2 // C# 7.2及更高版本可用\u0026#xD;\n0b_1_0_1 // C# 7.2及更高版本可用\u0026#xD;\n\u0026#xD;\n\u0026#xD;\nC# 7.2:非尾部命名參數
\u0026#xD;\n\u0026#xD;\nC#中的命名參數服務于兩種目的:
\u0026#xD;\n\u0026#xD;\n- 允許跳過可選參數; \u0026#xD;\n\u0026#xD;\n
- 明確訪問接口,尤其是Boolean參數。\u0026#xD;\n
該特性處理第二種情況。例如:
\u0026#xD;\n\u0026#xD;\nvoid DoSomething(bool delayExecution, bool continueOnError, int maxRecords);\u0026#xD;\nDoSomething(true, false, 100);\u0026#xD;\n\u0026#xD;\n\u0026#xD;\n除非開發人員記住了函數簽名,否則很難一眼就看出了true和false對應什么。過去,開發人員可以寫成下面這樣:
\u0026#xD;\n\u0026#xD;\nDoSomething(delayExecution: true, continueOnError: false, maxRecords: 100);\u0026#xD;\n\u0026#xD;\n\u0026#xD;\n但是,如果對maxRecords參數沒有疑問卻還需要指定似乎就有點奇怪。在非尾部命名參數提案中,開發人員可以根據需要指定參數。
\u0026#xD;\n\u0026#xD;\nDoSomething(delayExecution: true, continueOnError: false, 100);\u0026#xD;\n\u0026#xD;\n\u0026#xD;\n編者注:當清晰度成為問題時,Enum仍然好于Boolean。
\u0026#xD;\n\u0026#xD;\nC# 7.2:Private Protected
\u0026#xD;\n\u0026#xD;\nC#有5個訪問級別:private、internal、protected、protected或internal、public。但是,CLR還有第六個訪問級別,名為FamANDAssem,“允許程序集中的子類型訪問”。
\u0026#xD;\n\u0026#xD;\n冷知識:在CLR中,protected稱為family,而internal稱為assembly。
\u0026#xD;\n\u0026#xD;\n借助新關鍵字“private protected”,開發人員可以使用CLR的FamANDAssem標識了。Private Protected提案說明了這樣做的重要性:
\u0026#xD;\n\u0026#xD;\n\u0026#xD;\n在許多情況下,API都會包含一些成員函數,只打算讓提供該類型的程序集中的子類實現并使用。CLR提供了用于此目的的訪問級別,但C#中沒有。因此,別無選擇,API所有者要么訴諸于internal保護、自律或自定義分析器,要么使用protected,并提供額外的文檔說明,雖然該類型的公開文檔中有這個成員函數,但它并不是公有API的一部分。至于后者的例子,可以看下Roslyn CSharpCompilationOptions中以Common開頭的成員。
\u0026#xD;\n\u0026#xD;\n\u0026#xD;\nC# 7.2:只讀引用
\u0026#xD;\n\u0026#xD;\n我們之前報道過只讀引用,所以這里沒什么新東西要介紹。本質上講,只讀引用只是為了說明開發人員希望通過引用傳遞結構從而獲得性能收益,而不是真正改變值的能力。
\u0026#xD;\n\u0026#xD;\n目前,只讀引用提案尚處于原型階段,還沒有實現。
\u0026#xD;\n\u0026#xD;\nref-like類型編譯時安全強化[7.2提案]
\u0026#xD;\n\u0026#xD;\n該C#特性又稱為“內部指針”或“ref-like類型”。該提案旨在讓編譯器可以要求特定的類型(Span\u0026lt;T\u0026gt;)僅出現在棧上。該特性僅對高性能場景而言比較重要。從我們上次報道以來,ref-like類型提案沒有任何變化。
\u0026#xD;\n\u0026#xD;\n放棄的特性
\u0026#xD;\n\u0026#xD;\n以下特性沒有被標記為7.2提案的一部分。雖然這不是說一定不會標記,但可能不會很快發生。
\u0026#xD;\n\u0026#xD;\n- Blittable類型\u0026#xD;\n\u0026#xD;\n
- Ref本地重新賦值\u0026#xD;\n
查看英文原文: Catching up with C# 7.1 and C# 7.2
總結
以上是生活随笔為你收集整理的C# 7.1、7.2特性追踪的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果 watchOS 9.3 正式发布
- 下一篇: Enum in C#