翻譯|使用教程|編輯:陳津勇|2019-10-29 12:01:11.807|閱讀 295 次
概述:本文詳細(xì)介紹了空引用異常會出現(xiàn)的情況、啟用C#8.0消除空引用異常的方法。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
在數(shù)十年的編程中,NullReferenceException困擾著我們。盡管此異常很容易解決,但在其他地方發(fā)生此異常的可能性很高。
隨著C#8.0中可空值的引入,空引用異常出現(xiàn)的概率變得最小。本文,小編將指導(dǎo)您在C#程序中使用nullable以避免Null Reference Exception。(注意:本教程需使用Visual Studio 2019版本16.3或更高版本)
空引用異常的場景
首先讓我們看一下發(fā)生空引用異常的情況。考慮下面這個名為Commit的類,其中包含數(shù)據(jù)、用戶名、密碼和提交消息,以及僅初始化名字和姓氏值的構(gòu)造函數(shù)。
<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">班級提交</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
{</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
公用字符串UserName {get; </font><font style="vertical-align: inherit;">組; </font><font style="vertical-align: inherit;">}</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
公共字符串密碼{get; </font><font style="vertical-align: inherit;">組; </font><font style="vertical-align: inherit;">}</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
公共字符串CommitMessage {get; </font><font style="vertical-align: inherit;">組; </font><font style="vertical-align: inherit;">}</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
公共提交(字符串用戶名,字符串密碼)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
{</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
UserName =用戶名;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
密碼=密碼;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font><font></font>如果使用構(gòu)造函數(shù)創(chuàng)建Commit類的實例,并嘗試獲取CommitMessage的長度,則最終將導(dǎo)致null引用異常。
<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">靜態(tài)void Main(string [] args)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
{</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
提交初始=新的Commit(“ Suresh”,“ $ trongPassword123”);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
int messageLength = GetMessageLength(initial);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
Console.WriteLine(messageLength);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
static int GetMessageLength(公共人員)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
{</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
var commitMessage = person.CommitMessage;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
返回commitMessage.Length;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font><font></font>一旦發(fā)現(xiàn)這段代碼將導(dǎo)致null引用異常,就可以通過給它一個null檢查來修復(fù)它。
借助可為空的功能,即使在編譯代碼之前,也可以識別異常的發(fā)生。具體操作方法請往下看。
如何啟用C#8.0
可為空的功能是C#8.0更新的一部分,您必須先確認(rèn)您的項目已使用C#8.0編碼,然后才能繼續(xù)進(jìn)行。
在最新版本的Visual Studio中,禁止在項目屬性中更改語言版本的規(guī)定。

在進(jìn)一步檢查提供的鏈接時,我們發(fā)現(xiàn),當(dāng)項目的目標(biāo)框架是.NET Core 3.x或.NET Standard 2.1時,默認(rèn)語言版本是C#8.0。
如果您在項目中使用較舊的框架,但仍想嘗試此功能,則可以手動配置。編輯項目文件(* .csproj),并將語言版本標(biāo)簽的值(<LangVersion>)編輯為預(yù)覽,如下所示。
<font style="vertical-align: inherit;"><font style="vertical-align: inherit;"><PropertyGroup></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> <LangVersion>預(yù)覽</ LangVersion></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> </ PropertyGroup></font></font><font></font>
這將允許您使用編譯器支持的預(yù)覽c#語言中可用的特性。
使用可空的特性
現(xiàn)在,為整個項目啟用可空特性(也可以為特定類啟用它)。編輯項目文件,并使用enable值添加可空標(biāo)記。
<font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> <PropertyGroup></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> <OutputType> Exe </ OutputType></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> <TargetFramework> netcoreapp3.0 </ TargetFramework></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> <Nullable>啟用</ Nullable></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> </ PropertyGroup></font></font><font></font>
這將導(dǎo)致Commit類的構(gòu)造函數(shù)中出現(xiàn)警告,提示該CommitMessage未初始化。

避免警告和只擔(dān)心錯誤是普通開發(fā)人員的天性。在這里,我們不能忽略這個警告,因為它會在運行時導(dǎo)致異常。因此,使用null值初始化CommitMessage。

仍然會顯示警告。現(xiàn)在,通過將其聲明為可為空的字符串(string?),使CommitMessage屬性接受null。
<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">公共字符串?</font><font style="vertical-align: inherit;">CommitMessage {get; </font><font style="vertical-align: inherit;">組; </font><font style="vertical-align: inherit;">}
</font></font>嘗試訪問CommitMessage的長度時,警告將消失,并且新警告將顯示在Program.cs類中。

如果CommitMessage為null ,則返回0處理該警告。現(xiàn)在,該程序不再有可能出現(xiàn)空引用異常。
<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">static int GetMessageLength(公共人員)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
{</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
var commitMessage = person.CommitMessage;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
如果(commitMessage為null)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
返回0;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
返回commitMessage.Length;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font><font></font>您可以在點擊此處下載該項目的副本。
關(guān)注“慧聚IT”微信公眾號,及時獲取產(chǎn)品最新消息和最新資訊

本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@ke049m.cn
文章轉(zhuǎn)載自: