C 7 1 7 2特性追蹤

2021-09-17 19:18:02 字數 3919 閱讀 9114

作為visual studio 15.3的一部分,微軟發布了自.net 1.1以來c#的第乙個單點版本。c# 7.1提供了三個新特性,其中有兩個是成功有效的。

\\c# 7.1/7.2:default字面量

\\default字面量旨在減少一些樣板**。下面是乙個常見的例子:

\\

public task\u0026lt;order\u0026gt; getorderasync(int orderkey, cancellationtoken token = default(cancellationtoken))\
\\

這多少有點囉嗦,因此,模仿visual basic的nothing關鍵字,上述**可以寫成下面這樣:

\\

public task\u0026lt;order\u0026gt; getorderasync(int orderkey, cancellationtoken token = default)\
\\

這行**可以按照預期方式執行。但是,當使用乙個可空的值型別時,問題就來了。

\\

public task\u0026lt;order\u0026gt; getorders(int? limit = default)\
\\

這行**應該把limit引數置為空,但在c# 7.1中,它實際返回0。

\\ 這個問題的修復計畫在c# 7.2中進行,該版本會隨visual studio 15.5一起發布。

\\c# 7.1:元組名稱推斷\\

自從引入了匿名型別,c#就可以隱式命名屬性。例如,在下面這行**中,物件y會擁有名為ab的屬性。

\\

var y = new ;\
\\

在c# 7.1中,值元組也具有這個特性。

\\

var z1 = (a: x.a, b: x.b); //顯式名稱\var z2 = (x.a, x.b); //推斷名稱\
\\

c# 7.1:async main

\\ 這裡沒有多少可說的。main函式現在可以非同步執行,這減少了之前需要編寫的一些樣板**。

\\c# 7.2:條件ref

\\ c#的條件操作符通常被稱為「三元運算子」,因為這是這門語言中的唯一乙個。c# 7.2將會提供第二個三元操作符,名為條件ref操作符。

\\ 這個小特性讓開發人員可以在條件中使用ref表示式。下面是提案中的乙個例子:

\\

ref var r = ref (arr != null ? ref arr[0]: ref otherarr[0]);\
\\

注意,除了在靠近兩種可能結果的地方需要使用ref關鍵字外,在包含整個表示式的括號外也需要使用ref關鍵字。

\\c# 7.2:起始分隔符

\\ 該特性擴充套件了在數值字面量中使用下劃線的能力。下面的示例摘自提案:

\\

123 // c# 1.0及更高版本可用\\1_2_3 // c# 7.0及更高版本可用\0x1_2_3 // c# 7.0及更高版本可用\0b101 // c# 7.0新增的二進位制字面量\0b1_0_1 // c# 7.0及更高版本可用\\// 在c# 7.2中,_可以用在`0x`或`0b`之後\0x_1_2 // c# 7.2及更高版本可用\0b_1_0_1 // c# 7.2及更高版本可用\
\\

c# 7.2:非尾部命名引數

\\ c#中的命名引數服務於兩種目的:\\

該特性處理第二種情況。例如:

\\

void dosomething(bool delayexecution, bool continueonerror, int maxrecords);\dosomething(true, false, 100);\
\\

除非開發人員記住了函式簽名,否則很難一眼就看出了truefalse對應什麼。過去,開發人員可以寫成下面這樣:

\\

dosomething(delayexecution: true, continueonerror: false, maxrecords: 100);\
\\

但是,如果對maxrecords引數沒有疑問卻還需要指定似乎就有點奇怪。在非尾部命名引數提案中,開發人員可以根據需要指定引數。

\\

dosomething(delayexecution: true, continueonerror: false, 100);\
\\

編者注:當清晰度成為問題時,enum仍然好於boolean

\\c# 7.2:private protected

\\ c#有5個訪問級別:privateinternalprotectedprotectedinternalpublic。但是,clr還有第六個訪問級別,名為famandassem,「允許程式集中的子型別訪問」。

\\ 冷知識:在clr中,protected稱為family,而internal稱為assembly

\\ 借助新關鍵字「private protected」,開發人員可以使用clr的famandassem標識了。private protected提案說明了這樣做的重要性:

\\

\

在許多情況下,api都會包含一些成員函式,只打算讓提供該型別的程式集中的子類實現並使用。clr提供了用於此目的的訪問級別,但c#中沒有。因此,別無選擇,api所有者要麼訴諸於internal保護、自律或自定義分析器,要麼使用protected,並提供額外的文件說明,雖然該型別的公開文件中有這個成員函式,但它並不是公有api的一部分。至於後者的例子,可以看下roslyncsharpcompilationoptions中以common開頭的成員。

\

\\

c# 7.2:唯讀引用

\\ 我們之前報道過唯讀引用,所以這裡沒什麼新東西要介紹。本質上講,唯讀引用只是為了說明開發人員希望通過引用傳遞結構從而獲得效能收益,而不是真正改變值的能力。

\\ 目前,唯讀引用提案尚處於原型階段,還沒有實現。

\\ref-like型別編譯時安全強化[7.2提案]

\\ 該c#特性又稱為「內部指標」或「ref-like型別」。該提案旨在讓編譯器可以要求特定的型別(span\u0026lt;t\u0026gt;)僅出現在棧上。該特性僅對高效能場景而言比較重要。從我們上次報道以來,ref-like型別提案沒有任何變化。

\\放棄的特性

\\ 以下特性沒有被標記為7.2提案的一部分。雖然這不是說一定不會標記,但可能不會很快發生。\\

檢視英文原文: catching up with c# 7.1 and c# 7.2

C 7 1 7 2特性追蹤

作為visual studio 15.3的一部分,微軟發布了自.net 1.1以來c 的第乙個單點版本。c 7.1提供了三個新特性,其中有兩個是成功有效的。c 7.1 7.2 default字面量 default字面量旨在減少一些樣板 下面是乙個常見的例子 public task u0026lt o...

C 7 1 7 2特性追蹤

作為visual studio 15.3的一部分,微軟發布了自.net 1.1以來c 的第乙個單點版本。c 7.1提供了三個新特性,其中有兩個是成功有效的。c 7.1 7.2 default字面量 default字面量旨在減少一些樣板 下面是乙個常見的例子 public task u0026lt o...

C 7 1 7 2特性追蹤

作為visual studio 15.3的一部分,微軟發布了自.net 1.1以來c 的第乙個單點版本。c 7.1提供了三個新特性,其中有兩個是成功有效的。c 7.1 7.2 default字面量 default字面量旨在減少一些樣板 下面是乙個常見的例子 public task u0026lt o...