在寫C#代碼的時候,你可能經常會遇到這個錯誤:
但如果想避免NullReferenceException的發生,確實需要做很多麻煩的作業,
可空參考型別 Null Reference Type
所以,C# 8的可空參考型別就出現了,
C# 8可以讓你在編譯時就避免null參考錯誤,它并不是把null值從代碼里移除了,而是它可以讓你表達意圖,具體的做法就是你可以告訴編譯器哪個參考可能是null的,而哪些參考不可能是null,
看下面這個例子:
很顯然,我們期待person這個引數它不可以是null的,
但是在C# 8之前,如果我們這樣呼叫該方法,那么在編譯時是不會報錯的:
而如果運行程式,那么結果就是:
打開null檢查
而在Visual Studio 2019里面(C# 8的專案),修改專案檔案,添加null檢查之后:
這里就會出現警告,
例子:
有兩個類,Person類的Address屬性的型別是另外一個類:
現在可以看到,這些屬性都出現了波浪線的警告,如果我們build一下這個專案,那么也會出現很多警告:
這是因為我們把這兩個類的成員宣告稱了非null的參考型別,而我卻沒有對它們進行初始化,
成員可能是null的
如果我想讓這些成員可以為null(意圖上),那么就需要把它們設定為可null的(意圖),在型別后邊加上問號“?”即可:
再次build專案之后,警告都沒有了:
然后再看一下這個方法:
這里person.Address.Province有一個警告,是因為Address可能是null,
可以有幾種辦法把這個警告去掉,首先是使用null條件運算子:
如果是Address是null的話,就輸出null,
或者,如果你確認Address屬性不會是null,那么可以在Address后添加一個嘆號”!“,表示Address肯定不是null:
這個嘆號的作用僅僅是去掉了警告,它沒有改變任何運行時的狀況,如果Address為null,那么這句話仍然會拋出NullReferenceException,
所以,只有確認我們訪問的東西肯定不是null的時候,才應該使用"!",
成員不可能是null
下面我更改一下思路意圖,假設所有的成員都不可能為null,那么修改兩個類:
類成員又出現了警告,
而回到方法里,我把嘆號和問號都去掉之后,也不會出現警告了,因為它認為所有的成員都不會是null了:
但是還要記住,這個只是在編譯時進行的檢查,如果成員為null,還是會拋出例外的,這種操作對于運行時來說沒有任何改變,
解決成員上出現的警告
使用建構式對成員初始化,可以去掉這些警告:
另外一種辦法就是直接對屬性進行初始化:
我們還是采用建構式初始化的辦法吧,
往建構式里傳遞null
那么往建構式里面傳遞null會出現什么情況呢?試一下:
提示還是比較智能的,有警告,它說無法把null這個字面值轉化為非null的參考型別,
另一種開啟nullable檢查的方式
如果把老專案的專案檔案直接添加以下內容:
那么專案在編譯的時候很可能出現大規模的問題,
所以一點一點啟用nullable檢查是比較好的做法,
首先我把專案檔案恢復原狀,然后打開某個檔案,在檔案最上面添加以下內容:
然后在檔案的最下面添加:
這樣的話,這個檔案里面所有的內容都開起了nullable檢查,
或者,我們也可以只針對一段代碼進行檢查:
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/118994.html
標籤:C#
上一篇:.NET Core 下使用 Log4Net 記錄日志
下一篇:C# yield關鍵字
