91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#中檢查null的語法糖有哪些

發布時間:2022-04-24 10:08:54 來源:億速云 閱讀:132 作者:iii 欄目:開發技術

這篇文章主要介紹了C#中檢查null的語法糖有哪些的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇C#中檢查null的語法糖有哪些文章都會有所收獲,下面我們一起來看看吧。

函數參數null檢查

傳統寫法

寫一個函數的時候,最經典的檢查,估計也是大家最常使用的null檢查,應該是這樣的吧:

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

ThrowIfNull

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

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

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

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

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

它通過在參數后面疊加!!表示此參數不可為空,運行時會自動進行檢查,如果是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);
}

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

他們還討論了很多別的形式,每種都提出了各自的優缺點挺有意思的,能看出來有一點設計語言的嚴謹和小強迫癥在,點贊~

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;

有關null的一些操作

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

??

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

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

??=

當左邊是null,那么就對左邊的變量賦值成右邊的

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

?.

當左邊是null,那么不執行后面的操作,直接返回空,否則就返回實際操作的值。

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
    }
}

注意,如果鏈式使用的過程中,只要前面運算中有一個是null,那么將直接返回null結果,不會繼續計算。下面兩個操作會有不同的結果。

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.
    }
}

一些操作

//參數給予默認值
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的時候,依然執行代碼
if(obj != null) 
    obj.Act();
//替換
obj?.Act();

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

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

津市市| 镇康县| 黄平县| 仪征市| 吉林省| 富裕县| 汤原县| 岢岚县| 永平县| 淅川县| 保亭| 城口县| 绥芬河市| 墨玉县| 北票市| 门源| 宜宾县| 都昌县| 石河子市| 黄梅县| 贡山| 砀山县| 天全县| 民勤县| 顺昌县| 古田县| 清新县| 鹤壁市| 苍梧县| 仙游县| 吉林省| 涿鹿县| 花莲市| 普宁市| 建阳市| 沧源| 会东县| 登封市| 山西省| 黔南| 老河口市|