翻譯|使用教程|編輯:陳津勇|2019-10-29 12:01:11.807|閱讀 280 次
概述:本文詳細介紹了空引用異常會出現的情況、啟用C#8.0消除空引用異常的方法。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
在數十年的編程中,NullReferenceException困擾著我們。盡管此異常很容易解決,但在其他地方發生此異常的可能性很高。
隨著C#8.0中可空值的引入,空引用異常出現的概率變得最小。本文,小編將指導您在C#程序中使用nullable以避免Null Reference Exception。(注意:本教程需使用Visual Studio 2019版本16.3或更高版本)
空引用異常的場景
首先讓我們看一下發生空引用異常的情況。考慮下面這個名為Commit的類,其中包含數據、用戶名、密碼和提交消息,以及僅初始化名字和姓氏值的構造函數。
<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>
如果使用構造函數創建Commit類的實例,并嘗試獲取CommitMessage的長度,則最終將導致null引用異常。
<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">靜態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>
一旦發現這段代碼將導致null引用異常,就可以通過給它一個null檢查來修復它。
借助可為空的功能,即使在編譯代碼之前,也可以識別異常的發生。具體操作方法請往下看。
如何啟用C#8.0
可為空的功能是C#8.0更新的一部分,您必須先確認您的項目已使用C#8.0編碼,然后才能繼續進行。
在最新版本的Visual Studio中,禁止在項目屬性中更改語言版本的規定。
在進一步檢查提供的鏈接時,我們發現,當項目的目標框架是.NET Core 3.x或.NET Standard 2.1時,默認語言版本是C#8.0。
如果您在項目中使用較舊的框架,但仍想嘗試此功能,則可以手動配置。編輯項目文件(* .csproj),并將語言版本標簽的值(<LangVersion>)編輯為預覽,如下所示。
<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>預覽</ LangVersion></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> </ PropertyGroup></font></font><font></font>
這將允許您使用編譯器支持的預覽c#語言中可用的特性。
使用可空的特性
現在,為整個項目啟用可空特性(也可以為特定類啟用它)。編輯項目文件,并使用enable值添加可空標記。
<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>
這將導致Commit類的構造函數中出現警告,提示該CommitMessage未初始化。
避免警告和只擔心錯誤是普通開發人員的天性。在這里,我們不能忽略這個警告,因為它會在運行時導致異常。因此,使用null值初始化CommitMessage。
仍然會顯示警告。現在,通過將其聲明為可為空的字符串(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處理該警告。現在,該程序不再有可能出現空引用異常。
<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>
您可以在點擊此處下載該項目的副本。
關注“慧聚IT”微信公眾號,及時獲取產品最新消息和最新資訊
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自: