C# ?的使用小結(jié)
可空類型標(biāo)記符(?)
說(shuō)明:
- 可空類型標(biāo)記符
?
用于指示某個(gè)值類型(如int
、float
等)可以為null
。這是C# 2.0引入的一個(gè)特性,用于處理數(shù)據(jù)庫(kù)查詢、JSON解析等場(chǎng)景中可能出現(xiàn)的空值。
示例代碼:
int? nullableInt = 5; int? nullableIntWithNull = null; if (nullableInt.HasValue) { Console.WriteLine(nullableInt.Value); // 輸出: 5 } if (!nullableIntWithNull.HasValue) { Console.WriteLine("The value is null."); // 輸出: The value is null. }
空值傳播操作符(?.)
說(shuō)明:
- 空值傳播操作符
?.
用于在訪問可能為null
的對(duì)象的成員之前進(jìn)行空檢查。如果對(duì)象為null
,則不會(huì)嘗試訪問其成員,而是直接返回null
。
示例代碼:
string str = null; int? length = str?.Length; // length 為 null,因?yàn)?str 為 null Person person = null; string jobTitle = person?.JobTitle; // jobTitle 為 null,因?yàn)?person 為 null person = new Person { JobTitle = "Software Engineer" }; jobTitle = person?.JobTitle; // jobTitle 為 "Software Engineer"
條件(三元)運(yùn)算符(?:)
說(shuō)明:
- 條件運(yùn)算符
?:
是C#中的三元運(yùn)算符,用于根據(jù)條件選擇兩個(gè)值之一。其語(yǔ)法為condition ? expression1 : expression2
。
示例代碼:
int x = 10; int y = 5; int max = x > y ? x : y; // max 為 10 Console.WriteLine("最大值: " + max);
空值合并操作符(??)
說(shuō)明:
- 空值合并操作符
??
用于在第一個(gè)操作數(shù)為null
時(shí)返回第二個(gè)操作數(shù)的值,否則返回第一個(gè)操作數(shù)的值。這常用于提供默認(rèn)值以避免null
引發(fā)的異常。
示例代碼:
string name = null; string displayName = name ?? "匿名用戶"; // displayName 為 "匿名用戶" string username = "DeveloperDave"; displayName = username ?? "Newbie"; // displayName 為 "DeveloperDave",因?yàn)?username 不為 null Console.WriteLine(displayName);
空值合并賦值運(yùn)算符(??=)
說(shuō)明:
- 空值合并賦值運(yùn)算符
??=
是C# 8.0及更高版本中引入的一個(gè)特性,它結(jié)合了空值合并運(yùn)算符(??
)和賦值運(yùn)算符(=
)的功能。這個(gè)運(yùn)算符用于將右側(cè)的值賦給左側(cè)的變量,但僅當(dāng)左側(cè)的變量為null
時(shí)。如果左側(cè)的變量不為null
,則不會(huì)更改其值。這提供了一種更簡(jiǎn)潔的方式來(lái)為可能為null
的變量提供默認(rèn)值或更新它們的值,而無(wú)需編寫額外的if
語(yǔ)句。
示例代碼:
string firstName = null; firstName ??= "未知"; // 如果 firstName 是 null,則將其設(shè)置為 "未知" Console.WriteLine(firstName); // 輸出: 未知 firstName = "John"; firstName ??= "未知"; // firstName 不是 null,所以不會(huì)更改其值 Console.WriteLine(firstName); // 輸出: John // 示例使用可空類型 int? age = null; age ??= 30; // 如果 age 是 null,則將其設(shè)置為 30 Console.WriteLine(age.HasValue ? age.Value.ToString() : "null"); // 輸出: 30 age = 25; age ??= 30; // age 不是 null,所以不會(huì)更改其值 Console.WriteLine(age.HasValue ? age.Value.ToString() : "null"); // 輸出: 25 // 示例使用類對(duì)象的屬性 Person person = null; person ??= new Person { Name = "默認(rèn)名稱" }; // 如果 person 是 null,則創(chuàng)建新實(shí)例并賦值 if (person != null) { Console.WriteLine(person.Name); // 如果 person 是新創(chuàng)建的實(shí)例,則輸出: 默認(rèn)名稱 } person = new Person { Name = "John Doe" }; person.Name ??= "默認(rèn)名稱"; // person.Name 不是 null,所以不會(huì)更改其值 Console.WriteLine(person.Name); // 輸出: John Doe
在上面的示例中,??=
運(yùn)算符首先檢查左側(cè)的變量(或?qū)傩裕┦欠駷?code>null。如果是,則將其設(shè)置為右側(cè)的值;如果不是,則保持其當(dāng)前值不變。這種操作對(duì)于初始化可能為null
的變量或在某些條件下更新它們非常有用。
請(qǐng)注意,最后一個(gè)示例中嘗試使用??=
來(lái)更新Person
對(duì)象的Name
屬性可能不會(huì)按預(yù)期工作,因?yàn)?code>??=是專門為變量賦值設(shè)計(jì)的,而不是用于屬性的。在屬性上使用??=
會(huì)導(dǎo)致編譯錯(cuò)誤,除非該屬性是特殊的(如可空值類型的自動(dòng)實(shí)現(xiàn)屬性)。
到此這篇關(guān)于C# ?的使用小結(jié)的文章就介紹到這了,更多相關(guān)C# ?使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C#中?、?.、??、??=運(yùn)算符的用法
- C#中單問號(hào)(?)和雙問號(hào)(??)的用法整理
- C# 運(yùn)算符 ?、??、?: 各種問號(hào)的用法和說(shuō)明
- C#中Try-Catch語(yǔ)句真的影響程序性能嗎?
- C#中的問號(hào)(?號(hào))用法小結(jié)
- C# null 合并運(yùn)算符??(雙問號(hào))使用示例
- 探討c#中的unchecked是什么意思,起什么作用?
- c# 空合并運(yùn)算符“??”的使用詳解
- 基于C# 中可以new一個(gè)接口?的問題分析
- C# 中的??操作符淺談
- java與c#的區(qū)別、兩者有什么不同?
- c#中?的六種用途
相關(guān)文章
C#事件中的兩個(gè)參數(shù)詳解(object sender,EventArgs e)
這篇文章主要介紹了C#事件中的兩個(gè)參數(shù)詳解(object sender,EventArgs e),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09基于C#的socket編程的TCP異步的實(shí)現(xiàn)代碼
本篇文章主要介紹了基于C#的socket編程的TCP異步的實(shí)現(xiàn)代碼,詳解的講訴了TCP通信異步的實(shí)現(xiàn),有興趣的可以了解一下。2016-11-11C#基于WebSocket實(shí)現(xiàn)聊天室功能
這篇文章主要為大家詳細(xì)介紹了C#基于WebSocket實(shí)現(xiàn)聊天室功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02C# 如何獲取出錯(cuò)的錯(cuò)誤所在行數(shù)信息
本文主要介紹 C# 中獲取錯(cuò)誤所在行的方法,在開發(fā)過(guò)程中或是用戶在使用過(guò)程中,出錯(cuò)的話方便我們快速定位到錯(cuò)誤的位置,以便我們處理。2016-04-04