最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# 8.0可空引用類型的使用注意記錄

 更新時(shí)間:2019年04月07日 09:13:28   作者:自來喵的野  
這篇文章主要給大家介紹了關(guān)于C# 8.0可空引用類型使用注意的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

前言

最近VS2019正式版發(fā)布了,裝下來順便試用了一下C#8.0,最大的看點(diǎn)應(yīng)該就是可空引用類型了。不過C#8.0仍然處于Beta的狀態(tài),而且試用時(shí)也遇到了幾個(gè)坑。

背景知識(shí)說明:

所謂的可空引用類型是指,一旦啟用了可空引用類型這個(gè)新特征,引用類型將默認(rèn)被視為不可空,無法賦予null,除非手工將它設(shè)為可空引用類型。

實(shí)戰(zhàn)示例:

首先是新建一個(gè)C#的項(xiàng)目,在 項(xiàng)目文件(.csproj)里加入兩行配置,目的是啟用“C#8.0語言”和“可空引用類型”:

<LangVersion>8.0</LangVersion>
<NullableContextOptions>enable</NullableContextOptions>

整個(gè)文件看起來是這樣的:

這樣就算是整個(gè)項(xiàng)目全局啟用了可空引用類型了。

注意:

在VS2019正式版中,使用

<NullableContextOptions>enable</NullableContextOptions>

而不是使用

<NullableReferenceTypes>true</NullableReferenceTypes>

后者在正式版中已經(jīng)失效了。

如果不希望全局啟用可空引用類型的話,可以在程序代碼中加入以下編譯指令:

#nullable enable

這樣可以在加入了該指令的文件中,單獨(dú)啟用可空引用類型。但是,極度不推薦這種做法。為什么呢?因?yàn)樵撝噶顑H僅在該文件中有效,不能跨文件生效,從而無法阻止null逃逸到使用了該指令的文件中,也就是說,用了也等于沒用。

一個(gè)很簡(jiǎn)單的例子足以證明:

注意上面項(xiàng)目文件中并沒有全局啟用可空引用類型,而下面的Class1.cs中使用了編譯器指令來單獨(dú)啟用可空引用類型。

從運(yùn)行結(jié)果可見,空引用仍然逃逸到使用了該指令的作用域中了。別說編譯錯(cuò)誤,連編譯警告都沒有。完全達(dá)不到理想的效果。

因此,強(qiáng)烈建議在項(xiàng)目文件中全局啟用可空引用類型,而不是在某個(gè)源文件中單獨(dú)使用。

另外,還有一點(diǎn)要注意的是,即使啟用了可空引用類型后,默認(rèn)情況下,即使對(duì)不可空引用賦予null,編譯器也只會(huì)生成編譯警告,而不是編譯錯(cuò)誤。仍然是能夠編譯通過的。一個(gè)大項(xiàng)目中,編譯警告不可避免,甚至可能會(huì)很多,從而淹沒了“給不可空引用類型賦予空值”這種不起眼的警告。

因此,建議將特定的警告視為錯(cuò)誤。警告編號(hào)為8600、8625、8618、8604,或者將所有警告視為錯(cuò)誤。具體是在項(xiàng)目文件中加入以下設(shè)置(見圖一):

<WarningsAsErrors>8600 8625 8618 8604</WarningsAsErrors>

或者在項(xiàng)目編輯器中設(shè)置也可以:

這是我自己測(cè)試得出的結(jié)果,可能還有其它潛在的相關(guān)警告編號(hào)我沒有測(cè)試出來。如果有誰知道的話,告訴我一下,謝謝。

做好這些配置之后,可以看到引用類型默認(rèn)都不能賦予空值了:

這時(shí)候普通的引用類型的變量和參數(shù)都不能設(shè)為null了。

這樣可以防止空值擴(kuò)散開來,引起惱人的空引用異常。

但是,這里有個(gè)坑需要注意?。。。?/strong>

struct里不適用可空引用的規(guī)則?。?/p>

struct里不適用可空引用的規(guī)則??!

struct里不適用可空引用的規(guī)則?。?/p>

這種情況下直接運(yùn)行,仍然會(huì)拋出空引用異常?。?!C#8.0仍未能完全封堵住空引用的逃逸。

其實(shí)我還是比較贊同用不可空引用類型的方案的,而不是可空引用類型的方案。畢竟我想要的,只不過是一個(gè)不可空的斷言,只是想利用不可空引用來劃分安全邊界,從而防止空值的擴(kuò)散。簡(jiǎn)單來說就是想將變量和參數(shù)明確聲明為不可空引用類型。因?yàn)闅v史和現(xiàn)實(shí)的原因,大量的庫都還沒能全面使用可空引用類型。這種情況下,只有我使用可空引用類型,是不靠譜的。無法劃分安全邊界。

然而C#選擇了可空引用類型的方案,而且還不是強(qiáng)制啟用,而且默認(rèn)只是警告。。跟沒有一樣。。。

比方說,我使用了一個(gè)第三方庫項(xiàng)目,而空值的來源是正好是該庫項(xiàng)目的,而我對(duì)這個(gè)庫并沒有源代碼或者修改權(quán)限。這時(shí)候就無法阻止空值逃逸到我的項(xiàng)目中了。

還是之前的代碼,只是稍微做一下修改。新增了一個(gè)庫項(xiàng)目ClassLibrary1,這個(gè)庫并沒有使用可空引用類型。

庫的代碼如下:

很簡(jiǎn)單,就是LibClass3.GetInstance()本應(yīng)該返回LibClass2的實(shí)例,但是出于某種原因,返回了null。但是我的項(xiàng)目中使用了LibClass2和LibClass3。我的項(xiàng)目是全局啟用了可空引用類型的:

編譯正常,毫無警告和錯(cuò)誤。一旦運(yùn)行,則拋出空引用異常:

可見,目前來說,C#8.0的可空引用類型并不能解決外源性的空值擴(kuò)散,只能解決內(nèi)源性的空值擴(kuò)散,無法跨模塊生效。還是洗洗睡吧。

參考資料:

https://docs.microsoft.com/en-us/dotnet/csharp/nullable-references

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/nullable-types/index

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-8.0/nullable-reference-types-specification

https://github.com/dotnet/roslyn/blob/master/docs/features/nullable-reference-types.md

https://www.youtube.com/watch?v=VdC0aoa7ung

https://stackoverflow.com/questions/54852880/what-is-the-difference-between-nullablecontextoptions-and-nullablereferencetypes

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • WPF中圖像處理的方法介紹

    WPF中圖像處理的方法介紹

    這篇文章介紹了WPF中圖像處理的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • c#枚舉值增加特性說明(推薦)

    c#枚舉值增加特性說明(推薦)

    這篇文章主要介紹了c#枚舉值增加特性說明(推薦),需要的朋友可以參考下
    2017-05-05
  • Unity讀取Excel文件轉(zhuǎn)換XML格式文件

    Unity讀取Excel文件轉(zhuǎn)換XML格式文件

    這篇文章主要為大家詳細(xì)介紹了Unity讀取Excel文件轉(zhuǎn)換XML格式文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • C#處理類型和二進(jìn)制數(shù)據(jù)轉(zhuǎn)換并提高程序性能

    C#處理類型和二進(jìn)制數(shù)據(jù)轉(zhuǎn)換并提高程序性能

    這篇文章介紹了C#處理類型和二進(jìn)制數(shù)據(jù)轉(zhuǎn)換并提高程序性能的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • C#實(shí)現(xiàn)批量Word轉(zhuǎn)換Html的示例代碼

    C#實(shí)現(xiàn)批量Word轉(zhuǎn)換Html的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用C#批量Word轉(zhuǎn)換Html的功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • C#中值類型和引用類型的區(qū)別深度分析

    C#中值類型和引用類型的區(qū)別深度分析

    這篇文章主要介紹了C#中值類型和引用類型的區(qū)別深度分析,以通俗易懂的語言形象化的分析了C#中值類型和引用類型的區(qū)別,對(duì)于深入理解C#數(shù)據(jù)類型有著不錯(cuò)的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-11-11
  • UGUI實(shí)現(xiàn)4位驗(yàn)證碼輸入

    UGUI實(shí)現(xiàn)4位驗(yàn)證碼輸入

    這篇文章主要為大家詳細(xì)介紹了UGUI實(shí)現(xiàn)4位驗(yàn)證碼輸入,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C#中WebBrowser.DocumentCompleted事件多次調(diào)用問題解決方法

    C#中WebBrowser.DocumentCompleted事件多次調(diào)用問題解決方法

    這篇文章主要介紹了C#中WebBrowser.DocumentCompleted事件多次調(diào)用問題解決方法,本文講解了3種情況和各自情況的解決方法,需要的朋友可以參考下
    2015-01-01
  • 如何利用Jenkins + TFS為.Net Core實(shí)現(xiàn)持續(xù)集成/部署詳解

    如何利用Jenkins + TFS為.Net Core實(shí)現(xiàn)持續(xù)集成/部署詳解

    這篇文章主要給大家介紹了關(guān)于如何利用Jenkins + TFS為.Net Core實(shí)現(xiàn)持續(xù)集成/部署的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • C#中靜態(tài)方法和實(shí)例化方法的區(qū)別、使用

    C#中靜態(tài)方法和實(shí)例化方法的區(qū)別、使用

    這篇文章主要介紹了C#中靜態(tài)方法和實(shí)例化方法的區(qū)別、使用,文中講解的非常細(xì)致,對(duì)大家的學(xué)習(xí)有所幫助,感興趣的朋友可以了解下
    2020-06-06

最新評(píng)論

罗甸县| 边坝县| 亳州市| 甘洛县| 萍乡市| 高密市| 潞西市| 凤冈县| 张北县| 长白| 青川县| 碌曲县| 巫山县| 元谋县| 杭锦后旗| 永昌县| 佛坪县| 芮城县| 开封县| 和田县| 宜春市| 涡阳县| 万宁市| 瑞金市| 阿尔山市| 读书| 汾阳市| 大渡口区| 沅陵县| 永吉县| 湖南省| 左贡县| 望奎县| 宕昌县| 育儿| 定陶县| 洞头县| 通州区| 东乡| 上杭县| 南川市|