溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C#中檢查null的語(yǔ)法糖有哪些

發(fā)布時(shí)間:2022-04-24 10:08:54 來(lái)源:億速云 閱讀:123 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹了C#中檢查null的語(yǔ)法糖有哪些的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇C#中檢查null的語(yǔ)法糖有哪些文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。

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

傳統(tǒng)寫法

寫一個(gè)函數(shù)的時(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

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

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

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

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

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

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

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

這個(gè)代碼會(huì)被編譯器翻譯成:

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

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

他們還討論了很多別的形式,每種都提出了各自的優(yōu)缺點(diǎn)挺有意思的,能看出來(lái)有一點(diǎn)設(shè)計(jì)語(yǔ)言的嚴(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的一些操作

說(shuō)起這個(gè),就順便說(shuō)說(shuō)c#處理null的另外幾個(gè)語(yǔ)法糖吧。

??

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

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

??=

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

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)绞褂玫倪^(guò)程中,只要前面運(yùn)算中有一個(gè)是null,那么將直接返回null結(jié)果,不會(huì)繼續(xù)計(jì)算。下面兩個(gè)操作會(huì)有不同的結(jié)果。

using System;
public class C {
    public static void Main() {
        string[] i = null;
        Console.WriteLine(i?[1]?.Substring(0).Length); //不彈錯(cuò)誤
        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"


//防止對(duì)象為null的時(shí)候,依然執(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 = "無(wú)結(jié)果為null";
//替換
var result= dict.TryGetValue(key, out var value) ? value ?? "有結(jié)果為null" : "無(wú)結(jié)果為null";

關(guān)于“C#中檢查null的語(yǔ)法糖有哪些”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“C#中檢查null的語(yǔ)法糖有哪些”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI