Visual Studio 2019 preview中體驗C# 8.0新語法

準備工作:

Visual Studio 2019 Preview版本中并沒有包含所有的C# 8.0的新功能,但目前也有一些可以試用了。在開始之前,需要進行入兩項設置:

  1. 將Framework設置為.net core 3.0
  2. 將C#語法設置為8.0

也可以直接編輯.csproj文件,修改TargetFramework和LangVersion為如下形式:

???? <TargetFramework>netcoreapp3.0</TargetFramework>
???? <LangVersion>8.0</LangVersion>

?

Nullable reference types

空引用對于所有編程者來說相信都是一個非常頭痛的問題,圖靈獎得主Tony Hoare 就把包含空引用的編程語言用定義為一個十億美元的錯誤Null References: The Billion Dollar Mistake。

首先還是來一段簡單的代碼:

???? string?s?=?null;
???? Console.WriteLine($"The?first?letter?of?{s}?is?{s[0]}");

這段代碼編譯沒有問題,但運行的時候會拋空引用異常的。

在C# 8.0中,開啟了空引用異常檢測后,上述代碼在編譯器就會檢查出告警來。

????

????

并且它會結合上下文判斷,如果該值不會為null,則不會告警,非常智能。

????

細心的朋友可能會發現,雖然在下面使用的地方沒有告警,但是變量初始化的地方還是報告警了。如果我們的程序本身就是允許null值改怎么辦呢,放任告警不管也是不合適的做法。

針對這個問題,C#引入了一個新的聲明為可空對象的語法:

???? string??s?=?null;

也就是在類型后加一個?符號,表面該對象是一個可空對象。

由于這個行為和之前的C#版本是不一致的,因此默認是沒有開啟這個功能的,我們需要在csproj文件中打開這個設置:

???? <LangVersion>8.0</LangVersion>
???? <NullableReferenceTypes>true</NullableReferenceTypes>

不知道在后續的VS的版本中會不會直接再界面上添加這一設置。

最后總結一下,Nullable reference types主要干了兩件事:

  1. 可以通過對象聲明判斷該對象是否可能為空。
  2. 當可空對象使用在不可空的場景是,會報告警。

雖然之前有一些第三方插件也集成了類似的功能,如Resharper的Null Check,但把這個功能集成到了編譯器上后更加簡潔好用。

C#的空對象檢查在設計期間也有好幾種語法方案,目前這種方案既解決了問題,又對現有代碼保持完全兼容,還能對現有代碼潛在性問題能進行分析,是一種比較理想的方案的。如果以后能通過設置,將空引用的告警級別可以設置為錯誤就更好了。

?

Ranges and indices

范圍和索引是C#新引入的語法,它主要引入了兩個對象Range和Index。

Index

首先還是來看一個簡單的例子。

???? var numbers = new[] { 1, 2, 3, 4, 5, 6, 7 };
???? Index i1 = 3; // number 3 from beginning
???? Index i2 = ^2; // number 2 from end
???? Console.WriteLine($"{numbers[i1]}, {numbers[i2]}"); // "4, 6"

這個例子簡單的演示了一下Index的用法,Index本身還是類似于之前的int索引的,它也可以和int類型轉換。但Index在int索引的方式擴展了一下,支持從后往前訪問,也就是我們說的倒數位。

???? Index i2 = ^2; // number 2 from end

Range

基于Index組成起點和終點,可以組成了一個范圍Range,根據Range可以對數組進行切片。

???? Range?range?=?Range.Create(i1,?i2);
???? int[]?slice?=?numbers[range];????????//"4,?5"

".."運算符

為了快速表示一個Range,C#還映入了一個新的運算符".."如上面的代碼就可以簡寫為:

???? int[]?slice?=?numbers[i1..i2];????????//"4,?5"

".."語法不復雜,通過".."連接的開頭和結尾的索引,用來表示一個范圍。為了使用方便,".."運算符的開頭和結尾是可以省略的,常用的大致就有這幾種形式。

???? string?text?=?"hello?c#?8.0";
???? Console.WriteLine(text[..]); //"hello c# 8.0"
???? Console.WriteLine(text[^3..]);??????//"8.0"
???? Console.WriteLine(text[..5]);???????//"hello"
???? Console.WriteLine(text[6..]);???????//"c#?8.0"

通過".."運算符,我們描述切片時可以清晰很多,例如如下這個常見的求字符串子串的例子:

???? var?sub?=?text.Substring(text.Length?-?6,?6);
???? var?sub2?=?text[^6..];

.net 3.0的很多類都內置了對Range的切片操作,常見的有:

  1. 字符串用來子串
  2. Array用來劃獲取子數組
  3. span<T>用來切片

?

Asynchronous streams

異步流能一種拉的方式進行異步迭代,配合async編程可以以異步的方式把socket流像本地文件一樣解析,相信這是很多用c#寫socket程序的程序員所喜歡的一個特性。

一個簡單的示例如下:

???? static?async?IAsyncEnumerable<string>?GetNamesAsync()
???? {
????????await?Task.Delay(1000);
????????yield?return?"hello";
????????await?Task.Delay(1000);
????????yield?return?"world";
???? }
????

???? await?foreach?(var?name?in?GetNamesAsync())
???? {
????????Console.WriteLine(name);
???? }

我在Visual Studio 2019 preview中試用這個功能的時候,發現無法編譯通過。MS解釋說這個是VS和.net core代碼沒有完全匹配上所致,我們可以手動添加相關代碼以完成這一編譯過程。?

namespace System.Threading.Tasks
{using System.Runtime.CompilerServices;using global::System.Threading.Tasks.Sources;internal struct ManualResetValueTaskSourceLogic<TResult>{private ManualResetValueTaskSourceCore<TResult> _core;public ManualResetValueTaskSourceLogic(IStrongBox<ManualResetValueTaskSourceLogic<TResult>> parent) : this() { }public short Version => _core.Version;public TResult GetResult(short token) => _core.GetResult(token);public ValueTaskSourceStatus GetStatus(short token) => _core.GetStatus(token);public void OnCompleted(Action<object> continuation, object state, short token, ValueTaskSourceOnCompletedFlags flags) => _core.OnCompleted(continuation, state, token, flags);public void Reset() => _core.Reset();public void SetResult(TResult result) => _core.SetResult(result);public void SetException(Exception error) => _core.SetException(error);}
}namespace System.Runtime.CompilerServices
{internal interface IStrongBox<T> { ref T Value { get; } }
}
View Code

?

其他語法

本身C# 8.0是還有幾個其它語法的,如接口默認方法,高級模式匹配等。這些語法在目前的VS 2019 preview中還無法體驗。估計后續會慢慢放開的,到時候我再寫相關文章介紹它們。

相關文章:

https://blogs.msdn.microsoft.com/dotnet/2018/12/05/take-c-8-0-for-a-spin/

?

轉載于:https://www.cnblogs.com/TianFang/p/10076992.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/278735.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/278735.shtml
英文地址,請注明出處:http://en.pswp.cn/news/278735.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

jQuery 對HTML的操作(二)

文章目錄一、jQuery獲取、設置HTML標簽的內容和屬性獲得內容 - text()、html() 以及 val()獲取屬性 - attr()&#xff0c;prop()二、增刪 HTML 的內容增加刪除三、操作CSSaddClass 添加removeClass 刪除toggleClass 切換css 獲取與設置所有操作html、css方法參考 ☆四、操作元素…

roku能不能安裝軟件_如何在Roku中使用Google Assistant

roku能不能安裝軟件As more of our devices connect to each other, it’s always nice to know that different products from different companies work together. A Chromecast isn’t expensive, but being able to use your TV directly with Google Assistant is better.…

在線建立或重做mysql主從復制架構方法(傳統模式和GTID模式)【轉】

mysql主從復制架構,是mysql數據庫主要特色之一&#xff0c;絕大多數公司都有用到。 而GTID模式是基于事務的復制模式的意思&#xff0c;發展到現在也是越來越多人用。 以前很多文章&#xff0c;介紹搭建mysql主從復制架構&#xff0c;是需要停止應用服務來做的,對于生產環境&am…

面試學習資料

1 Java面試資料總結 &#xff08;github推薦指數高&#xff09; 2 后端架構師 1. 綜合 《Java 面試題 —— 老梁 Java 面試通關要點匯總集》《Java 面試題 —— 老徐 Java 初中級準備的面試題》《Java 面試題 —— 零度 Java 面試題系列》《Java 面試題 —— 東黃的學習方法和面…

jQuery對Ajax的封裝應用(三)

文章目錄一、Ajax二、load三、ajax&#xff08;參數&#xff09;&#xff0c;get&#xff0c;set$.ajax$.ajax的get、post簡寫形式四、ajax全部方法參考 ☆一、Ajax AJAX 是與服務器交換數據的技術&#xff0c;它在不重載全部頁面的情況下&#xff0c;實現了對部分網頁的更新。…

如何使用卡巴斯基急救盤清理感染的PC

When you’re dealing with a PC that is completely infected in viruses, sometimes the best thing to do is reboot into a rescue disk and run a full virus scan from there. Here’s how to use the Kaspersky Rescue Disk to clean an infected PC. 當您要處理一臺完全…

2018.12.08 codeforces 946D. Timetable(背包)

傳送門 題意簡述&#xff1a;有一個人上n天課&#xff0c;每天有m個小時的時間安排表&#xff08;一個01串&#xff09;&#xff0c;為1表示要上課&#xff0c;否則不上課&#xff0c;求出如果可以最多翹kkk節課這nnn天在校待的總時間的最小值&#xff08;一天必須在所有課上完…

jQuery雜項進階(四)

文章目錄一、$ 的替換二、使用JSONP實現跨域三、jQuery 雜項方法、實用工具、回調對象、延遲對象參考 ☆四、jQuery 自身屬性參考 ☆五、jQuery 插件介紹和參考 ☆jQuery 樹型菜單插件(Treeview)jQuery Validate表單驗證&#xff0c;jQuery Password Validation&#xff08;密碼…

什么是WLIDSVC.EXE和WLIDSVCM.EXE,它們為什么運行?

You’re no doubt reading this article because you’re wondering what those two processes are doing cluttering up Task Manager, and also wondering why they are in capital letters. You’ve come to the right place. 毫無疑問&#xff0c;您閱讀本文是因為您想知道…

[USACO10DEC] Treasure Chest

題目鏈接 90 Points&#xff1a;智障的區間 DP……設 dp[i][j] 表示區間 [i, j] 能取的最大價值&#xff0c;但我還是 sd 地開了第三維表示先取還是后取的價值。 交上去以為能 A&#xff0c;結果 #2 開心地 MLE……一看內存&#xff0c;64MB&#xff08;把評測機吊起來打一頓&a…

工程化,模塊化,組件化,規范化

前端講究 工程化&#xff0c;模塊化&#xff0c;組件化&#xff0c;層層遞進。 一、工程化 工程化是整個工程的結構、樣式和動作分離&#xff0c;工程化是一種思想而不是某種技術&#xff08;當然為了實現工程化我們會用一些技術&#xff09;。各種規范、技術選型、項目構建優…

linux壓縮和解壓縮_Linux QuickTip:一步下載和解壓縮

linux壓縮和解壓縮Most of the time, when I download something it’s a file archive of some kind – usually a tarball or a zip file. This could be some source code for an app that isn’t included in Gentoo’s Portage tree, some documentation for an internal …

Spark架構與作業執行流程簡介

2019獨角獸企業重金招聘Python工程師標準>>> Spark架構與作業執行流程簡介 博客分類&#xff1a; spark Local模式 運行Spark最簡單的方法是通過Local模式&#xff08;即偽分布式模式&#xff09;。 運行命令為&#xff1a;./bin/run-example org.apache.spark.exam…

Spring boot整合Mongodb

最近的項目用了Mongodb&#xff0c;網上的用法大多都是七零八落的沒有一個統一性&#xff0c;自己大概整理了下&#xff0c;項目中的相關配置就不敘述了&#xff0c;由于spring boot的快捷開發方式&#xff0c;所以spring boot項目中要使用Mongodb&#xff0c;只需要添加依賴和…

nodejs和Vue和Idea

文章目錄Vue環境搭建Idea安裝Idea中配置Vue環境Node.js介紹npm介紹Vue.js介紹[^3]Idea介紹Vue環境搭建 概述&#xff1a;vue環境搭建&#xff1a;需要npm&#xff08;cnpm&#xff09;&#xff0c;而npm內嵌于Node.js&#xff0c;所以需要下載Node.js。 下載Node.js&#xff1…

Spring MVC上下文父子容器

2019獨角獸企業重金招聘Python工程師標準>>> Spring MVC上下文父子容器 博客分類&#xff1a; java spring 在Spring MVC的啟動依賴Spring框架&#xff0c;有時候我們在啟動Spring MVC環境的時候&#xff0c;如果配置不當的話會造成一些不可預知的結果。下面主要介紹…

12.7 Test

目錄 2018.12.7 TestA 序列sequence(迭代加深搜索)B 轟炸bomb(Tarjan DP)C 字符串string(AC自動機 狀壓DP)考試代碼AC2018.12.7 Test題目為2018.1.4雅禮集訓。 時間&#xff1a;4.5h期望得分&#xff1a;010010實際得分&#xff1a;010010 A 序列sequence(迭代加深搜索) 顯然可…

word文檔中統計總頁數_如何在Google文檔中查找頁數和字數統計

word文檔中統計總頁數Whether you’ve been given an assignment with a strict limit or you just like knowing how many words you’ve written, Google Docs has your back. Here’s how to see exactly how many words or pages you’ve typed in your document. 無論您是…

vue 入門notes

文章目錄vue一、js基礎二、封裝緩存三、組件1、組件創建、引入、掛載、使用2、組件間的傳值- 父組件主動獲取子組件的數據和方法&#xff08;子組件給父組件傳值&#xff09;&#xff1a;- 子組件主動獲取父組件的數據和方法&#xff08;父組件給子組件傳值&#xff09;&#x…

spring集成 JedisCluster 連接 redis3.0 集群

2019獨角獸企業重金招聘Python工程師標準>>> spring集成 JedisCluster 連接 redis3.0 集群 博客分類&#xff1a; 緩存 spring 客戶端采用最新的jedis 2.7 1. maven依賴&#xff1a; <dependency> <groupId>redis.clients</groupId> <artifact…