VS 2019要來了,是時候瞭解一下C# 8.0新功能
近日,微軟釋出了Visual Studio 2019 的釋出日期,2019年4月2日Visual Studio 2019 將正式和大家見面,同時微軟還將提供釋出現場實時直播。
除了Visual Studio 2019自身之外,VS 2019的釋出還牽動著很多C#開發者的心。雖然一個月之前釋出的Visual Studio 2019 Preview版本已經可以試用C#的某些新功能,但還有一些是不可試用的。
下面我們就來看一下微軟官方對C#8.0重要功能的概述。
可空的引用型別
此功能的目的是防止無處不在的空引用異常,空引用異常已經困擾物件導向程式設計半個世紀了。該功能將阻止開放者將null值放入到普通的引用型別中,例如String型別不可為空。但它不是強制性的error,而是比較溫和的warning。
這些異常現在已經過了半個世紀的物件導向程式設計。
它阻止你null進入普通的引用型別,例如string- 它使這些型別不可為空!它是溫和的,有警告,而不是錯誤。但是在現有程式碼上會出現新警告,因此您必須選擇使用該功能(您可以在專案,檔案甚至原始碼級別執行此功能)。
string s = null; // Warning: Assignment of null to non-nullable reference type
如果你想要使用null怎麼辦?可以使用可為空的引用型別,例如string?:
string? s = null; // Ok
當你使用了可空引用時,需要先檢查一下其是否為null,編譯器會分析程式碼流,以檢視null值是否可以將其用於您使用它的位置:
void M(string? s){ Console.WriteLine(s.Length); // Warning: Possible null reference exception if (s != null) { Console.WriteLine(s.Length); // Ok: You won't get here if s is null }}
C#允許表達可空的意圖,但是在不遵守規則時會發出警告。
非同步流
C#5.0的async / await功能允許在簡單的程式碼中使用(並生成)非同步結果,而無需回撥:
async Task\u0026lt;int\u0026gt; GetBigResultAsync(){ var result = await GetResultAsync(); if (result \u0026gt; 20) return result; else return -1;}
下面我們來介紹一下大家期待已久的IAsyncEnumerable, 非同步版本的IEnumerable。該語言允許await foreach使用元素,並使用yield return生成元素。
async IAsyncEnumerable\u0026lt;int\u0026gt; GetBigResultsAsync(){ await foreach (var result in GetResultsAsync()) { if (result \u0026gt; 20) yield return result; }}
範圍和索引
我們正在新增一個可用於索引的Index型別。你可以使用int從頭建立,也可以使用^從末尾開始計算字首運算子:
Index i1 = 3; // number 3 from beginning
Index i2 = ^4; // number 4 from end
int[] a = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Console.WriteLine($\u0026quot;{a[i1]}, {a[i2]}\u0026quot;); // “3, 6”
另外,我們還引入了一個Range型別,它由兩個Indexes 組成,一個用於開始,一個用於結束,並且可以用x…y 範圍表示式編寫。
可以使用a進行索引Range以生成切片:
var slice = a[i1…i2]; // { 3, 4, 5 }
介面成員的預設實現
今天,大家對於介面都有這樣一個需求:在不破壞現有狀態的情況下新增一個成員。
在C#8.0中,我們會為介面成員提供一個主體。如果有人沒有實現該成員(或者是在編寫程式碼時還沒有實現),會獲得預設實現。
interface ILogger{ void Log(LogLevel level, string message); void Log(Exception ex) =\u0026gt; Log(LogLevel.Error, ex.ToString()); // New overload}class ConsoleLogger : ILogger{ public void Log(LogLevel level, string message) { ... } // Log(Exception) gets default implementation}
在ConsoleLogger類不需要實現ILogger的Log(Exception)過載,因為它已經預設實現了。現在只要給當前實現者提供了預設實現,就可以向現有公共介面新增新成員。
遞迴模式
我們允許pattern中包含其他pattern:
IEnumerable\u0026lt;string\u0026gt; GetEnrollees(){ foreach (var p in People) { if (p is Student { Graduated: false, Name: string name }) yield return name; }}
pattern Student { Graduated: false, Name: string name }主要檢查Person是a Student,然後將常量pattern false應用於其Graduated屬性以檢視它們是否仍然已註冊,並將pattern string name應用於其Name屬性以獲取其名稱(如果為非null)。因此,如果p是一個Student,尚未畢業並且姓名非空,那麼我們就可以yield return這個名字。
Switch表示式
帶有pattern的switch語句在C#7.0中已經非常強大了,但是編寫起來卻很麻煩,而Switch 表示式卻是一個解決這種問題的、“輕量級”的版本。
var area = figure switch { Line _ =\u0026gt; 0, Rectangle r =\u0026gt; r.Width * r.Height, Circle c =\u0026gt; Math.PI * c.Radius * c.Radius, _ =\u0026gt; throw new UnknownFigureException(figure)};
目標型別的新表示式
在許多情況下,往往建立新物件時,型別已經從上下文中給出。在這些情況下,我們會讓你省略型別:
Point[] ps = { new (1, 4), new (3,-2), new (9, 5) }; // all Points
C#大版本關鍵更新回顧
C#1.0(Visual Studio .NET)
- Classes
- Structs
- Interfaces
- Events
- Properties
- Delegates
- Expressions
- Statements
- Attributes
- Literal
C#2(VS 2005)
- Generics
- Partial types
- Anonymous methods
- Iterators
- Nullable types
- Getter/setter separate accessibility
- Method group conversions (delegates)
- Static classes
- Delegate inferenc
C#3(VS 2008)
- Implicitly typed local variables
- Object and collection initializers
- Auto-Implemented properties
- Anonymous types
- Extension methods
- Query expressions
- Lambda expression
- Expression trees
- Partial methods
C#4(VS 2010)
- Dynamic binding
- Named and optional arguments
- Co- and Contra-variance for generic delegates and interfaces
- Embedded interop types (“NoPIA”
C#5(VS 2012)
- Asynchronous methods
- Caller info attributes
C#6(VS 2015)
- Draft Specification online
- Compiler-as-a-service (Roslyn)
- Import of static type members into namespace
- Exception filters
- Await in catch/finally blocks
- Auto property initializers
- Default values for getter-only properties
- Expression-bodied members
- Null propagator (null-conditional operator, succinct null checking)
- String interpolation
- nameof operator
- Dictionary initializer
C#7.0(Visual Studio 2017)
- Out variables
- Pattern matching
- Tuples
- Deconstruction
- Discards
- Local Functions
- Binary Literals
- Digit Separators
- Ref returns and locals
- Generalized async return types
- More expression-bodied members
- Throw expressions
平臺依賴
大多數的C# 8.0功能都可以在任何版本的.NET上執行,但也有一些功能是有平臺依賴性的,例如非同步流、範圍和索引都依賴 .NET Standard 2.1一部分的新框架型別。其中,.NET Standard 2.1、.NET Core 3.0以及Xamarin,Unity和Mono都將實現 .NET Standard 2.1,而.NET Framework 4.8不會,所以如果你使用的是 .NET Framework 4.8,那麼C# 8.0的部分功能可能不能使用。
另外,介面成員的預設實現也依賴新的執行時增強功能,所以此功能也不適用於 .NET Framework 4.8和舊版本的 .NET。
微軟官方部落格連結:https://blogs.msdn.microsoft.com/dotnet/2018/11/12/building-c-8-0/
相關文章
- 是時候該瞭解一波Protocol Buffers了[Java]ProtocolJava
- 是時候該瞭解一波Protocol Buffers了[Android]ProtocolAndroid
- VS Code Spring 全新功能來了!Spring
- Fragment新功能,setMaxLifecycle瞭解一下Fragment
- 還在寫iOS?是時候學一下Flutter了iOSFlutter
- 是時候從頭瞭解一下游戲化設計的基本要素
- 機器人素質教育,是時候普及一下了機器人
- 是時候來了解下 HTTPS 網站的部署了HTTP網站
- 達成兩億玩家的小目標後,是時候來定義一下「明日like」了
- [MySQL光速入門]013 是時候來一發考試, 展示一下真正的實力了!!!MySql
- 《糖豆人》--是時候談談它的未來了
- 平安AI護航,是時候來次教育升級了AI
- AI與雲這門To B生意,是時候“娘化”一下了AI
- 2024, 是時候告別CentOS了CentOS
- 是時候扔掉 Postman 了,Apifox 真香!PostmanAPI
- 你的 ResNet 是時候更新了
- 爆款頻出!是時候瞭解一下這個被忽視的4億玩家遊戲市場遊戲
- 對DevOps的九大誤解,是時候糾正了!dev
- C#中的explicit和implicit瞭解一下吧C#
- 阿里動物園新來了一頭“小蠻驢”,瞭解一下阿里
- Rpc 的時代要來臨了RPC
- 被疫情“帶飛”的家庭健身市場,是時候捲起來了
- 【Android Adapter】是時候開啟Adapter新時代了AndroidAPT
- 是時候放棄 el-form 元件了ORM元件
- 是時候重新審視AB測試了
- 是時候體驗一下 Ant Design Pro & Laravel 開發的漂亮的後臺 QuarkAdmin 了Laravel
- 是時候瞭解一波虛擬機器的類載入機制虛擬機
- 雲端計算市場,是時候來一場魷魚遊戲了遊戲
- 馬蹄疾 | 2019年,是時候認真學一波 Grid 佈局了
- 來,瞭解一下Java記憶體模型(JMM)Java記憶體模型
- 川普啟動美國AI計劃後,是時候瞭解美國眼中的「中國AI戰略」了AI
- RAGFlow開源Star量破萬,是時候思考下RAG的未來是什麼了
- 是時候為Spring Boot 3.0做準備了Spring Boot
- 非智慧WAF,是時候轉身離場了
- 6 歲!是時候重新認識下 Serverless 了Server
- 6歲!是時候重新認識下Serverless了Server
- 是時候學習真正的 spark 技術了Spark
- office 2019 新功能是什麼?