C#中?,??,??=,?:?,?.?,?[]各種問(wèn)號(hào)的用法和說(shuō)明詳解
前言
在 C# 中,問(wèn)號(hào)(?)遠(yuǎn)不止是一個(gè)簡(jiǎn)單的標(biāo)點(diǎn)符號(hào)。隨著語(yǔ)言版本的迭代更新,C# 圍繞問(wèn)號(hào)(?)發(fā)展出了一套強(qiáng)大而優(yōu)雅的空值處理和條件表達(dá)機(jī)制。熟練掌握這些操作運(yùn)算符不僅能大幅提升代碼的簡(jiǎn)潔性和可讀性,還能有效避免惱人的空引用異常,構(gòu)建更加健壯的應(yīng)用程序。
可空類型修飾符(?)
在 C# 中,值類型(如int、long、bool、DateTime等)默認(rèn)不能為null。使用 ? 修飾符,我們可以將值類型轉(zhuǎn)換為可空類型。
int notNullableInt;// 非空int類型默認(rèn)為 0
int? nullableInt = null;
bool? nullableBool = null;
long? nullableLong = null;
DateTime? nullableDate = null;
// 檢查是否有值
if (nullableInt.HasValue)
{
Console.WriteLine($"整數(shù)值: {nullableInt.Value}");
}
else
{
Console.WriteLine("變量沒(méi)有值(為null)");
}
Null 合并運(yùn)算符(??)
Null 合并運(yùn)算符(??)如果左邊的值不為null,則返回左邊的值,否則返回右邊的值。
static void Main(string[] args)
{
string userName1 = "小明";
string userName2 = null;
var getUserName = userName1 ?? userName2 ?? "默認(rèn)用戶";
Console.WriteLine(getUserName); // 輸出: 小明
string config1 = null;
string config2 = null;
string config3 = "DefaultConfig";
string finalConfig = config1 ?? config2 ?? config3 ?? "FallbackConfig";
Console.WriteLine(finalConfig); // 輸出: DefaultConfig
}
Null 合并賦值運(yùn)算符(??=)
C# 8.0 引入的運(yùn)算符,僅當(dāng)左操作數(shù)為null時(shí),才將右操作數(shù)的值賦給左操作數(shù)。這是懶加載模式的理想選擇。
static void Main(string[] args)
{
string? name = null;
name ??= "時(shí)光者";
Console.WriteLine(name); // 時(shí)光者
name ??= "大姚"; // 不改變
Console.WriteLine(name); // 時(shí)光者
//惰性初始化
Dictionary<string, string>? cache = null;
cache ??= new Dictionary<string, string>();
cache["UserName"] = name;
Console.WriteLine(cache["UserName"]);
}
三元條件運(yùn)算符(?:)
條件運(yùn)算符(?:),又稱三元運(yùn)算符,是一種簡(jiǎn)潔的條件表達(dá)式形式。它對(duì)布爾表達(dá)式進(jìn)行求值,并根據(jù)結(jié)果為true或false,選擇性地返回兩個(gè)表達(dá)式中的對(duì)應(yīng)結(jié)果,為簡(jiǎn)單條件判斷提供了一種比傳統(tǒng)if-else語(yǔ)句更緊湊、表達(dá)力更強(qiáng)的語(yǔ)法形式。
static void Main(string[] args)
{
int score = 80;
string level = score >= 60 ? "Pass" : "Fail";
Console.WriteLine(level);
}
Null 條件成員訪問(wèn)運(yùn)算符 (?.)
Null 條件成員訪問(wèn)運(yùn)算符 (?.) 在訪問(wèn)對(duì)象成員(屬性、方法、字段等)前先檢查對(duì)象是否為 null。如果對(duì)象為 null,整個(gè)表達(dá)式返回 null 而不會(huì)拋出 NullReferenceException;如果對(duì)象不為 null,則正常訪問(wèn)成員。
static void Main(string[] args)
{
// 基本用法
Person person = null;
string name = person?.Name; // 不會(huì)拋出異常,name 為 null
Console.WriteLine(name ?? "name is null"); // 輸出: name is null
}
Null 條件索引訪問(wèn)運(yùn)算符 (?[])
Null 條件索引訪問(wèn)運(yùn)算符 (?[]) 在使用索引器訪問(wèn)集合元素前先檢查集合對(duì)象是否為 null。如果集合為 null,整個(gè)表達(dá)式返回 null 而不會(huì)拋出異常;如果集合不為 null,則正常訪問(wèn)索引位置的元素。
static void Main(string[] args)
{
List<string> names = null;
string firstName = names?[0]; // 不會(huì)拋出異常,firstName 為 null
Console.WriteLine(firstName ?? "No names available"); // 輸出: No names available
// 初始化列表后訪問(wèn)
names = new List<string> { "時(shí)光者", "小袁", "大姚" };
string secondName = names?[0]; // 安全訪問(wèn)索引為0的元素
Console.WriteLine(secondName); // 輸出: 時(shí)光者
}
到此這篇關(guān)于C#中?,??,??=,?: ,?. ,?[]各種問(wèn)號(hào)的用法和說(shuō)明詳解的文章就介紹到這了,更多相關(guān)C# ?用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于C#實(shí)現(xiàn)Windows服務(wù)的方法詳解
在實(shí)際應(yīng)用過(guò)程中,有時(shí)候我們希望開(kāi)發(fā)的程序,不需要界面,直接開(kāi)機(jī)就可以長(zhǎng)時(shí)間運(yùn)行,這時(shí)候,我們可以考慮做成一個(gè)Windows服務(wù)。這篇文章跟大家介紹一下,如何基于C#實(shí)現(xiàn)Windows服務(wù)的創(chuàng)建、安裝、啟動(dòng)、停止和卸載,需要的可以參考一下2022-09-09
c#中WebService的介紹及調(diào)用方式小結(jié)
這篇文章主要給大家介紹了關(guān)于c#中的WebService及其調(diào)用方式的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11
基于C#實(shí)現(xiàn)員工IC卡的讀寫(xiě)功能
這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)讀寫(xiě)員工IC卡的功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下2023-01-01
c#圖片縮放圖片剪切功能實(shí)現(xiàn)(等比縮放)
c#圖片縮放剪切功能實(shí)現(xiàn),代碼中包含了c#圖片處理的一些基礎(chǔ)知識(shí),與大家分享2013-12-12
C#實(shí)現(xiàn)Struct結(jié)構(gòu)體與IntPtr轉(zhuǎn)換的示例詳解
在 C# 編程的世界里,我們常常會(huì)遇到需要與非托管代碼交互,或者進(jìn)行一些底層內(nèi)存操作的場(chǎng)景,下面小編就來(lái)分享兩段非常實(shí)用的 C# 擴(kuò)展方法代碼,它們實(shí)現(xiàn)了結(jié)構(gòu)體與IntPtr之間的轉(zhuǎn)換等功能2025-06-06
Unity實(shí)現(xiàn)鼠標(biāo)或者手指點(diǎn)擊模型播放動(dòng)畫(huà)
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)鼠標(biāo)或者手指點(diǎn)擊模型播放動(dòng)畫(huà),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-01-01
c# dataTable 合并兩個(gè)列到一個(gè)新列中的簡(jiǎn)單實(shí)例
這篇文章介紹了c# dataTable 合并兩個(gè)列到一個(gè)新列中的簡(jiǎn)單實(shí)例,有需要的朋友可以參考一下2013-10-10

