日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C# 8 新特性 - 可空引用类型

發(fā)布時間:2023/12/4 C# 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# 8 新特性 - 可空引用类型 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Nullable Reference Type.

在寫C#代碼的時候,你可能經(jīng)常會遇到這個錯誤:?

?

但如果想避免NullReferenceException的發(fā)生,確實需要做很多麻煩的工作。?

?

可空引用類型?Null Reference Type?

所以,C# 8的可空引用類型就出現(xiàn)了。?

C#?8可以讓你在編譯時就避免null引用錯誤,它并不是把null值從代碼里移除了,而是它可以讓你表達意圖。具體的做法就是你可以告訴編譯器哪個引用可能是null的,而哪些引用不可能是null?

?

看下面這個例子:?

很顯然,我們期待person這個參數(shù)它不可以是null的。?

?

但是在C#?8之前,如果我們這樣調(diào)用該方法,那么在編譯時是不會報錯的:?

?

而如果運行程序,那么結果就是:?

?

打開null檢查?

而在Visual Studio 2019里面(C# 8的項目),修改項目文件,添加null檢查之后:?

?

這里就會出現(xiàn)警告。?

?

例子:?

有兩個類,Person類的Address屬性的類型是另外一個類:?

現(xiàn)在可以看到,這些屬性都出現(xiàn)了波浪線的警告,如果我們build一下這個項目,那么也會出現(xiàn)很多警告:?

這是因為我們把這兩個類的成員聲明稱了非null的引用類型,而我卻沒有對它們進行初始化。?

?

成員可能是null?

如果我想讓這些成員可以為null(意圖上),那么就需要把它們設置為可null的(意圖),在類型后邊加上問號“?”即可:?

?

再次build項目之后,警告都沒有了:?

?

然后再看一下這個方法:?

這里person.Address.Province有一個警告,是因為Address可能是null?

?

可以有幾種辦法把這個警告去掉,首先是使用null條件操作符:?

如果是Address是null的話,就輸出null?

或者,如果你確認Address屬性不會是null,那么可以在Address后添加一個嘆號”!“,表示Address肯定不是null?

這個嘆號的作用僅僅是去掉了警告,它沒有改變?nèi)魏芜\行時的狀況,如果Addressnull,那么這句話仍然會拋出NullReferenceException?

?

所以,只有確認我們訪問的東西肯定不是null的時候,才應該使用"!"?

?

成員不可能是null?

下面我更改一下思路意圖,假設所有的成員都不可能為null,那么修改兩個類:?

類成員又出現(xiàn)了警告。?

?

而回到方法里,我把嘆號和問號都去掉之后,也不會出現(xiàn)警告了,因為它認為所有的成員都不會是null了:?

但是還要記住,這個只是在編譯時進行的檢查,如果成員為null,還是會拋出異常的。這種操作對于運行時來說沒有任何改變。?

?

解決成員上出現(xiàn)的警告?

使用構造函數(shù)對成員初始化,可以去掉這些警告:?

?

另外一種辦法就是直接對屬性進行初始化:?

?

我們還是采用構造函數(shù)初始化的辦法吧。?

?

往構造函數(shù)里傳遞null?

那么往構造函數(shù)里面?zhèn)鬟fnull會出現(xiàn)什么情況呢?試一下:?

提示還是比較智能的,有警告,它說無法把null這個字面值轉化為非null的引用類型。?

?

另一種開啟nullable檢查的方式?

如果把老項目的項目文件直接添加以下內(nèi)容:?

那么項目在編譯的時候很可能出現(xiàn)大規(guī)模的問題。?

?

所以一點一點啟用nullable檢查是比較好的做法。?

首先我把項目文件恢復原狀,然后打開某個文件,在文件最上面添加以下內(nèi)容:?

?

然后在文件的最下面添加:?

?

這樣的話,這個文件里面所有的內(nèi)容都開起了nullable檢查。?

或者,我們也可以只針對一段代碼進行檢查:?

總結

以上是生活随笔為你收集整理的C# 8 新特性 - 可空引用类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。