C#8小特性

 對於C# 8,有吸引了大多數注意力的重大特性,如默認接口方法和可空引用,也有許多小特性被考慮在內。本文將介紹幾例可能加入C#將來版本的小特性。

新的賦值運算符:&&=和||=

從第一個版本開始,C#就支持把等號和另一種運算符合在一塊兒的語法。這幾乎包括除短路布爾運算符&&和||以外的全部的二元操做符(如+、-、&等)。「賦值運算符&&=和||=」提案是對這個列表的補充。

逐字內插字符串

逐字字符串以@"開頭。內插字符串使用$"。可是,若是你想要一個既逐字又內插的字符串呢?是用@$"仍是$@"?目前,其中一個有效,另外一個會報編譯器錯誤,可是,人們一般很難記住哪一個是哪一個。

在一個名爲「逐字插入字符串」的中肯提案中,該語法將獲得擴展,接受@$"。對它的解釋將和逐字插入字符串($@")徹底相同,所以,你不再用擔憂弄反了。

關於這項修改,存在一些小爭議,由於有人認爲這沒有必要或者會致使不一致。

容許using語句結構匹配IDisposable

接口與C#編譯器之間存在着奇怪的關係。常常,你沒必要爲了使用一個語言特性而真正實現一個具體的抽象接口;你只需在相似抽象接口的類上建立一個公開的API。

典型的例子是「foreach」和IEnumerable。若是類有一個方法GetEnumerator,返回一個包含Current屬性和MoveNext方法的對象,那麼你就可使用foreach。實際的返回類型不重要,這使得List<T>這樣的相似能夠實現更快速的枚舉器。這一般稱爲「結構匹配(structural matching)」。

在這個提案中,using語句也將支持結構匹配。這乍看之下沒什麼用,由於你不會但願看到一個可釋放類沒有實現IDisposable。不過,有一種名爲ref struct的新類型。它們不能實現接口,所以,若是沒有這項提案,你在使用它們時就沒法使用using語句。

和foreach與using共用的擴展方法

這個提案是前述提案的補充,是爲了可以把GetEnumerator或Dispose做爲擴展方法添加,而且能夠分別和「foreach」或「using」共用。再次,咱們談論的這項特性僅用於很是特殊的狀況。例如,你能夠從第三方庫(這多是調用Marshal.ReleaseComObject的好地方)向一個COM對象添加一個Dispose擴展方法。

這還不是一個正式的提案,可能會合併到前面提到的「using」語句修改中。

「using」語句隱式做用域

目前,「using」語句後面只能是一個顯式做用域(即一對花括號)或者另外一個「using」語句。若是這個提案經過,你就能夠編寫下面這樣的代碼:

spa

using var a = new MyDisposable();
using var b = new MyDisposable();
using var c = new MyDisposable();


上述每一個變量都會在當前做用域結束時以相反的順序自動釋放。從功能上說,這和下面的代碼等價,但更簡潔,也不會引入新做用域。excel

using (var a = new MyDisposable())
using (var b = new MyDisposable())
using (var c = new MyDisposable())
{
    // 一些代碼
}

當須要多個可釋放對象而又不一樣時建立時,這項修改會特別有用。你甚至能夠在表達式中間建立可釋放對象,並且能夠確信,它將在當前做用域結束時釋放。對象

var results = myExcelReader.ReadResults(
                         using new MyExcelSheet(excelFilePath));


對於這項提案,其中一個批評是,它與某些語句如「goto」不兼容。blog

相關文章
相關標籤/搜索