• <center id="q6uyy"><td id="q6uyy"></td></center>
    <dd id="q6uyy"></dd>
  • 推廣 熱搜: csgo  vue  angelababy  2023  gps  新車  htc  落地  app  p2p 

    C# 11 中的參數 null 檢查

       2023-08-29 網絡整理佚名2230
    核心提示:檢查的代碼下面我們就來試一下吧,測試代碼如下:來執行代碼,可以看到類似下面的輸出結果:這個操作符不僅僅適用于方法參數,也可以用于委托參數、索引器等我們可以反編譯一下代碼來看一下實際生成的代碼是怎么樣的反編譯的結果如下:方法沒有了,有一個編譯器生成的另外一個方法,它是我們原來方法的變形,只增加了一句代碼可以看到實際是調用的同一個方法,參數也不能使用這個操作符,如:

    介紹

    C# 11 將引入一個新的運算符! 簡化代碼中參數的空檢查。 該版本已經支持此語法。 如果您有興趣,不妨嘗試一下。 我們來看看如何使用它。

    如果想在本地代碼中編譯測試,需要安裝.NET 7 1 SDK,下載地址:然后在本地創建一個控制臺應用程序,可以使用命令new來創建,手動修改項目文件,配置C#語言版本為,添加如下:

    <Project?Sdk="Microsoft.NET.Sdk">
    ??<PropertyGroup>
    ????<OutputType>ExeOutputType>
    ????<Targetframework>net7.0Targetframework>????
    ????<ImplicitUsings>enableImplicitUsings>
    ????<Nullable>enableNullable>
    +???<LangVersion>previewLangVersion>
    ??PropertyGroup>

    Project>

    !! 是一個new運算符,將其添加到參數后編譯器會自動生成一段空檢查代碼

    嘭嘭

    我們來嘗試一下,測試代碼如下:

    Hello("World");

    try
    {
    ????Hello(null!);
    }
    catch?(Exception?ex)
    {
    ????Console.WriteLine(ex);
    }

    void?Hello(string?name!!)
    {
    ????Console.WriteLine($"Hello,?{name}!");
    }

    運行run執行代碼,可以看到類似如下的輸出:

    可以看到,當傳遞null時,會拋出n異常,說明確實做了null檢查

    該運算符不僅適用于方法參數,還適用于委托參數、索引器等。

    什么是

    從上面的輸出中,我們可以看到存在空檢查。 它實際上是什么樣子的? 我們可以反編譯代碼,看看實際生成的代碼是什么樣的。 反編譯結果如下:

    類型和Main方法由編譯器自動生成,是C#9引入的頂級語句(Top-Level)

    可以看到我們代碼中的Hello方法不見了,多了一個編譯器生成的方法。 是我們原來方法的變形,只增加了一行代碼。

    <PrivateImplementationDetails>.ThrowIfNull(name,?"name");

    我們再看一下實現,如下:

    可以看到這里實現了null檢查。 如果參數為null,則會拋出n異常。 相信大家都知道它是如何實現的。 那么就有一個問題需要思考。 這里我們使用一個方法。 如果有兩個這樣的方法會是什么樣子?

    這個類會生成兩個嗎?我們來試試吧,我們把這個方法復制一下,改個名字,反編譯一下

    void?Hello1(string?name!!)?=>?Console.WriteLine($"Hello,?{name}!");

    反編譯結果如下:

    可以看到實際上調用的是同一個方法,

    這個類型只生成一次,那么如果這兩個方法在兩個項目中怎么辦? 你可以自己嘗試一下~~

    更多的

    使用該運算符時,有一些注意事項。 如果啟用可為空引用類型并將參數聲明為可為空引用類型,編譯器會產生警告,因為它實際上不應該為 null,為 null 會拋出異常,因此編譯器會發出警告,示例為如下:

    //?warning?CS8995:?Nullable?type?'string?'?is?null-checked?and?will?throw?if?null.//?void?Hello2(string??name!!)?=>?Console.WriteLine($"Hello,?{name}!");

    值類型不能使用該運算符,因為值類型不會為null,編譯器會直接報錯,但可為null的值類型是可以的,例如:

    //?error?CS8992:?Parameter?'int'?is?a?non-nullable?value?type?and?cannot?be?null-checked.//?void?Hello3(int?name!!)?=>?Console.WriteLine($"Hello,?{name}!");

    另外,out參數不能使用該運算符,如:

    //?error?CS8994:?'out'?parameter?'name'?cannot?be?null-checked.//?void?Hello4(out?string?name!!)?=>?name?=?"World";

    想要嘗試的朋友可以安裝.NET 7 1來體驗。 如果他們不想安裝,也可以通過在線網站體驗編譯器的新功能

    .NET中的代碼已經使用了這個new運算符來簡化參數的null檢查,可以參考:

    - 結束符 -

     
    反對 0舉報 0 收藏 0 打賞 0評論 0
     
    更多>同類資訊
    推薦圖文
    推薦資訊
    點擊排行
    網站首頁  |  關于我們  |  聯系方式  |  使用協議  |  版權隱私  |  網站地圖  |  排名推廣  |  廣告服務  |  積分換禮  |  網站留言  |  RSS訂閱  |  違規舉報
    Powered By DESTOON
     
    三级精品影视国产,欧美乱伦免费综合,亚洲a在线中文,人妻色综合网站
  • <center id="q6uyy"><td id="q6uyy"></td></center>
    <dd id="q6uyy"></dd>