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

詳解C#中檢查null的語法糖

 更新時間:2022年04月24日 08:17:42   作者:波多爾斯基  
這篇文章主要為大家詳細(xì)介紹了C#中檢查null的語法糖,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C#有一定幫助,感興趣的小伙伴可以了解一下

今天看到已經(jīng)更新了devblogs,新增的C# 11的!!(用于檢查null的語法)經(jīng)過非常長的討論,最后取消了。然后我又想起來null檢查,這個可以說一說。

函數(shù)參數(shù)null檢查

傳統(tǒng)寫法

寫一個函數(shù)的時候,最經(jīng)典的檢查,估計(jì)也是大家最常使用的null檢查,應(yīng)該是這樣的吧:

public static void GetV1(string prompt)
{
    if (prompt is null) throw new ArgumentNullException(nameof(prompt));
    Console.WriteLine(prompt);
}

ThrowIfNull

這個寫起來也沒啥問題,但是總覺得有點(diǎn)不舒適。.NET 6在ArgumentNullException中新增了ThrowIfNull方法,可以寫的更優(yōu)雅一點(diǎn)。

public static void GetV2(string prompt)
{
    ArgumentNullException.ThrowIfNull(prompt);
    Console.WriteLine(prompt);
} 

異常的時候,就會出現(xiàn):System.ArgumentNullException: 'Value cannot be null. (Parameter 'prompt')'。這個是不是簡單了點(diǎn)?可是還是需要寫一行。

C# 11的!!語法(已經(jīng)取消)

C# 11剛preview的時候,我就瞄到了這個特性,現(xiàn)在依然可以通過設(shè)置preview來進(jìn)行啟用,但是以后正式發(fā)布估計(jì)就不行了。

它通過在參數(shù)后面疊加!!表示此參數(shù)不可為空,運(yùn)行時會自動進(jìn)行檢查,如果是null就直接彈出錯誤。

public static void GetV3(string prompt!!)
{
    Console.WriteLine(prompt);
}

這個代碼會被編譯器翻譯成:

public static void GetV3(string prompt!!)
{
    if (prompt is null) {
        throw new ArgumentNullException(nameof(prompt));
    }
    Console.WriteLine(prompt);
}

這樣大家就可以專注于業(yè)務(wù)代碼,不需要經(jīng)??紤]異常檢查了。至于為什么這個東西最后還是被刪除了,可以從討論中看到一絲端倪,首先是感覺非常糾結(jié)于這個語法,兩個嘆號;然后就是已經(jīng)有比較多的方式可以實(shí)現(xiàn)檢查了,這個東西是否有必要。反正最終是以后再討論了,不過也可以看出來C#語言工作組對語言的特性討論非常謹(jǐn)慎。

他們還討論了很多別的形式,每種都提出了各自的優(yōu)缺點(diǎn)挺有意思的,能看出來有一點(diǎn)設(shè)計(jì)語言的嚴(yán)謹(jǐn)和小強(qiáng)迫癥在,點(diǎn)贊~

void M(string s!!);
void M(string! s);
void M(string s!);
void M(notnull string s);
void M(string s ?? throw);
void M(string s is not null);
void M(checked string s);
void M(string s) where s is not null;

有關(guān)null的一些操作

說起這個,就順便說說c#處理null的另外幾個語法糖吧。

??

如果左邊是的null,那么返回右邊的操作數(shù),否則就返回左邊的操作數(shù),這個在給變量賦予默認(rèn)值非常好用。

int? a = null;
int b = a ?? -1;
Console.WriteLine(b);  // output: -1

??=

當(dāng)左邊是null,那么就對左邊的變量賦值成右邊的

int? a = null;
a ??= -1;
Console.WriteLine(a);  // output: -1

?.

當(dāng)左邊是null,那么不執(zhí)行后面的操作,直接返回空,否則就返回實(shí)際操作的值。

using System;
public class C {
    public static void Main() {
        string i = null;
        int? length = i?.Length;
        Console.WriteLine(length ?? -1); //output: -1
    }
}

?[]

索引器操作,和上面的操作類似

using System;
public class C {
    public static void Main() {
        string[] i = null;
        string result = i?[1];
        Console.WriteLine(result ?? "null"); // output:null
    }
}

注意,如果鏈?zhǔn)绞褂玫倪^程中,只要前面運(yùn)算中有一個是null,那么將直接返回null結(jié)果,不會繼續(xù)計(jì)算。下面兩個操作會有不同的結(jié)果。

using System;
public class C {
    public static void Main() {
        string[] i = null;
        Console.WriteLine(i?[1]?.Substring(0).Length); //不彈錯誤
        Console.WriteLine((i?[1]?.Substring(0)).Length) // System.NullReferenceException: Object reference not set to an instance of an object.
    }
}

一些操作

//參數(shù)給予默認(rèn)值
if(x == null) x = "str";
//替換
x ??= "str";


//條件判斷
string x;
if(i<3) 
    x = y;
else 
{  
    if(z != null) x = z; 
    else z = "notnull";
}
//替換
var x = i < 3 ? y : z ?? "notnull"


//防止對象為null的時候,依然執(zhí)行代碼
if(obj != null) 
    obj.Act();
//替換
obj?.Act();

//Dictionary取值與賦值
string result;
if(dict.ContainKey(key))
{
    if(dict[key] == null) result = "有結(jié)果為null";
    else result = dict[key];
}
else 
    result = "無結(jié)果為null";
//替換
var result= dict.TryGetValue(key, out var value) ? value ?? "有結(jié)果為null" : "無結(jié)果為null";

結(jié)語

原來新定的C# 11提供了一個新的??,話說我個人還是挺喜歡這個特性的,不管以什么形式出現(xiàn)吧,期待以后再見。

C#中為了處理null給我們準(zhǔn)備了許多的語法糖,只能說非常簡便了。有很多人會說這個可讀性不好,或者覺得這是“茴字的幾種寫法”似的歪門邪道,我只能說,傳統(tǒng)的語法也不是說取消了,語言有發(fā)展,只要還是比較審慎的,我覺得還是一件好事。

到此這篇關(guān)于詳解C#中檢查null的語法糖的文章就介紹到這了,更多相關(guān)C#檢查null內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#編寫發(fā)送郵件組件

    C#編寫發(fā)送郵件組件

    本文給大家分享的是使用C#編寫的發(fā)送郵件的組件,非常的簡單實(shí)用,有需要的小伙伴可以參考下。
    2015-06-06
  • 淺談C#中的值類型和引用類型

    淺談C#中的值類型和引用類型

    在C#中值類型的變量直接存儲數(shù)據(jù),而引用類型的變量持有的是數(shù)據(jù)的引用,數(shù)據(jù)存儲在數(shù)據(jù)堆中。下面我們來簡單談?wù)凜#中的值類型和引用類型
    2016-06-06
  • C#.net中的類型轉(zhuǎn)換詳細(xì)介紹

    C#.net中的類型轉(zhuǎn)換詳細(xì)介紹

    C#.net中的類型轉(zhuǎn)換詳細(xì)介紹,需要的朋友可以參考一下
    2013-04-04
  • C#游戲開發(fā)之實(shí)現(xiàn)華容道游戲

    C#游戲開發(fā)之實(shí)現(xiàn)華容道游戲

    這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)經(jīng)典華容道游戲,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-01-01
  • C#自定義Attribute值的獲取與優(yōu)化技巧

    C#自定義Attribute值的獲取與優(yōu)化技巧

    C#自定義Attribute值的獲取是開發(fā)中會經(jīng)常用到的,大家通常使用反射進(jìn)行獲取的,代碼也很簡單,今天通過本文給大家講解C#?Attribute值獲取方法,感興趣的朋友跟隨小編一起看看吧
    2023-07-07
  • c# mutex互斥量的深入解析

    c# mutex互斥量的深入解析

    本篇文章主要是對c#中的mutex互斥量進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • C#創(chuàng)建數(shù)據(jù)庫及導(dǎo)入sql腳本的方法

    C#創(chuàng)建數(shù)據(jù)庫及導(dǎo)入sql腳本的方法

    這篇文章主要介紹了C#創(chuàng)建數(shù)據(jù)庫及導(dǎo)入sql腳本的方法,涉及C#針對數(shù)據(jù)庫的創(chuàng)建、連接、導(dǎo)入等相關(guān)操作技巧,需要的朋友可以參考下
    2015-12-12
  • C# WinForm創(chuàng)建Excel文件的實(shí)例

    C# WinForm創(chuàng)建Excel文件的實(shí)例

    下面小編就為大家?guī)硪黄狢# WinForm創(chuàng)建Excel文件的實(shí)例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • C#中Invoke和BeginInvoke區(qū)別小結(jié)

    C#中Invoke和BeginInvoke區(qū)別小結(jié)

    有時候,我們不得不跨線程調(diào)用主界面的控件來進(jìn)行操作,所以為了方便的解決問題,.net為我們提供了Invoke?與beginInvoke,那么Invoke和BeginInvoke區(qū)別在哪,本文就來詳細(xì)的介紹一下
    2023-08-08
  • C# 委托(跨窗體操作控件)實(shí)例流程講解

    C# 委托(跨窗體操作控件)實(shí)例流程講解

    今天研究了一下,在C#里面卻是可以不用自定義消息這么復(fù)雜的方法來實(shí)現(xiàn)跨窗體調(diào)用控件,C#有更好的辦法就是委托。
    2013-03-03

最新評論

平山县| 达拉特旗| 涞源县| 六枝特区| 靖西县| 潞城市| 怀远县| 罗平县| 马边| 冀州市| 呼玛县| 龙江县| 上犹县| 沙洋县| 厦门市| 福鼎市| 屏南县| 肃南| 信宜市| 贵港市| 阿拉善左旗| 中方县| 闸北区| 丰宁| 吉木乃县| 楚雄市| 崇阳县| 扬中市| 明星| 新郑市| 无极县| 博爱县| 景洪市| 偏关县| 南昌县| 邻水| 马边| 莲花县| 金阳县| 凤翔县| 海口市|