C# 可空類型的實(shí)現(xiàn)示例
前言
可空類型(Nullable)是一個極具實(shí)用性的特性,它為我們處理那些可能出現(xiàn)未賦值情況的數(shù)據(jù)提供了便捷且合理的方式。而其中,單問號(?)和雙問號(??)這兩個符號在可空類型的運(yùn)用中扮演著關(guān)鍵角色,各自有著獨(dú)特且重要的功能
一、單問號(?)
在 C# 中,像 int、double、bool 等這些基礎(chǔ)的數(shù)據(jù)類型,按照常規(guī)情況是無法直接賦值為 null 的。然而,實(shí)際編程場景中,尤其是在處理諸如數(shù)據(jù)庫等外部數(shù)據(jù)源時,常常會遇到數(shù)值類型或者布爾型的元素可能未被賦值的情況。這時,單問號(?)就派上用場了,它用于將這些原本不能賦值為 null 的數(shù)據(jù)類型轉(zhuǎn)變?yōu)榭煽疹愋停∟ullable 類型),意味著這個數(shù)據(jù)類型被賦予了可以存儲 null 值的能力。
例如,以下兩種寫法是等價的:
int? i = 3; Nullable<int> i = new Nullable<int>(3);
通過使用單問號(?),我們定義了一個可空的整型變量 i,它既可以像普通整型變量那樣存儲 int 類型正常范圍內(nèi)的值(例如 3),也可以存儲 null 值。對比普通的整型變量聲明:
int i; // 默認(rèn)值 0 int? ii; // 默認(rèn)值 null
可以清晰地看到,普通整型變量在未初始化賦值時,會有一個默認(rèn)的初始值 0,而可空整型變量 ii 的默認(rèn)值則是 null,這體現(xiàn)了可空類型在表示未賦值情況方面的獨(dú)特優(yōu)勢。
以 Nullable 為例,它讀作 “可空的 Int32”,其取值范圍非常靈活,不僅可以被賦值為 -2,147,483,648 到 2,147,483,647 之間的任意值(這是 Int32 類型本身正常的取值范圍),還可以被賦值為 null 值。類似地,對于 Nullable 變量而言,它打破了常規(guī)布爾型只能取 true 或 false 的限制,額外增加了可以賦值為 null 的能力,這在很多場景下都非常有用。
比如在處理數(shù)據(jù)庫相關(guān)操作時,數(shù)據(jù)庫中的布爾型字段可能會出現(xiàn)三種狀態(tài):存儲值 true、存儲值 false,或者該字段未定義(也就是對應(yīng)程序中的 null 值)??煽疹愋途湍芡昝赖剡m配這種情況,讓我們在程序中可以準(zhǔn)確地映射和處理數(shù)據(jù)庫中的數(shù)據(jù)狀態(tài),避免因數(shù)據(jù)可能未賦值而引發(fā)的錯誤或不合理的默認(rèn)賦值情況。
聲明一個可空類型(Nullable)有著特定的語法規(guī)范,其形式如下:
<data_type>? <variable_name> = null;
以下是一個展示可空數(shù)據(jù)類型用法的實(shí)例:
using System;
namespace CalculatorApplication
{
class NullablesAtShow
{
static void Main(string[] args)
{
// 聲明不同的可空類型變量,并進(jìn)行不同的賦值操作
int? num1 = null;
int? num2 = 45;
double? num3 = new double?();
double? num4 = 3.14157;
bool? boolval = new bool?();
// 顯示值
Console.WriteLine("顯示可空類型的值: {0}, {1}, {2}, {3}",
num1, num2, num3, num4);
Console.WriteLine("一個可空的布爾值: {0}", boolval);
Console.ReadLine();
}
}
}
當(dāng)上述代碼被編譯和執(zhí)行時,會輸出如下結(jié)果:
顯示可空類型的值:, 45, , 3.14157
一個可空的布爾值:
這里可以看到,對于賦值為 null 的可空變量(如 num1 和 num3),在輸出時會顯示相應(yīng)的空白占位(具體輸出格式可能因不同環(huán)境稍有差異,但能體現(xiàn)出其值為 null 的特點(diǎn)),而賦了具體值的可空變量(如 num2 和 num4)則正常輸出對應(yīng)的值,可空布爾型變量 boolval 由于初始化為 null,輸出時也相應(yīng)地體現(xiàn)出未賦值的狀態(tài)。
二、雙問號(??)
雙問號(??)被稱為 Null 合并運(yùn)算符,它主要用于定義可空類型和引用類型的默認(rèn)值,為類型轉(zhuǎn)換設(shè)定了一個預(yù)設(shè)值,以防可空類型的值為 null。
Null 合并運(yùn)算符的特性:如果第一個操作數(shù)的值為 null,那么運(yùn)算符就返回第二個操作數(shù)的值;反之,如果第一個操作數(shù)不為 null,則返回第一個操作數(shù)的值。它還能夠把操作數(shù)類型隱式轉(zhuǎn)換為另一個可空(或不可空)的值類型的操作數(shù)的類型,確保整個運(yùn)算在類型匹配方面的合理性。
以下是一個演示 Null 合并運(yùn)算符用法的實(shí)例:
using System;
namespace CalculatorApplication
{
class NullablesAtShow
{
static void Main(string[] args)
{
double? num1 = null;
double? num2 = 3.14157;
double num3;
// 使用 Null 合并運(yùn)算符進(jìn)行賦值判斷
num3 = num1?? 5.34; // 因?yàn)?num1 此時為 null 值,所以返回 5.34
Console.WriteLine("num3 的值: {0}", num3);
num3 = num2?? 5.34;
Console.WriteLine("num3 的值: {0}", num3);
Console.ReadLine();
}
}
}
當(dāng)這段代碼被編譯和執(zhí)行后,會產(chǎn)生如下結(jié)果:
num3 的值: 5.34
num3 的值: 3.14157
在上述代碼中,第一次對 num3 賦值時,由于 num1 的值為 null,根據(jù) Null 合并運(yùn)算符(??)的規(guī)則,就會返回第二個操作數(shù) 5.34 作為 num3 的值;而第二次賦值時,num2 的值不為 null(其值為 3.14157),所以直接返回 num2 的值給 num3。
這種機(jī)制在實(shí)際編程中有諸多應(yīng)用場景,比如在從配置文件或者用戶輸入獲取數(shù)據(jù)時,數(shù)據(jù)有可能是缺失(對應(yīng) null 值)的情況。我們可以利用 Null 合并運(yùn)算符為這些可能為 null 的可空類型變量設(shè)置一個合理的默認(rèn)值,確保后續(xù)程序在使用這些數(shù)據(jù)時能夠有一個明確的、符合預(yù)期的值可用,避免因 null 值引發(fā)的諸如空指針異常等各種錯誤。
到此這篇關(guān)于C# 可空類型的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)C# 可空類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實(shí)現(xiàn)頁面GZip或Deflate壓縮的方法
這篇文章主要介紹了C#實(shí)現(xiàn)頁面GZip或Deflate壓縮的方法,涉及C#通過GZipStream與DeflateStream實(shí)現(xiàn)頁面壓縮的相關(guān)技巧,需要的朋友可以參考下2015-06-06
C#中List轉(zhuǎn)IList的實(shí)現(xiàn)
本文主要介紹了C#中List轉(zhuǎn)IList的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
C#實(shí)現(xiàn)文件斷點(diǎn)續(xù)傳下載的方法
這篇文章主要介紹了C#實(shí)現(xiàn)文件斷點(diǎn)續(xù)傳下載的方法,涉及網(wǎng)絡(luò)文件操作的相關(guān)技巧,非常具有實(shí)用價值,需要的朋友可以參考下2015-05-05
C#自定義函數(shù)NetxtString生成隨機(jī)字符串
這篇文章主要介紹了C#自定義函數(shù)NetxtString生成隨機(jī)字符串,是十分常見的重要功能,需要的朋友可以參考下2014-08-08
C#調(diào)用C++使用C++/CLI的實(shí)現(xiàn)
在C#開發(fā)過程中,我們可能會遇到需要調(diào)用Windows API 或是第三方庫的場景,本文主要介紹了C#調(diào)用C++使用C++/CLI的實(shí)現(xiàn),具有一定的參考價值,感興趣的可以了解一下2024-03-03

