C 的新特性 可空型別

2021-05-22 07:22:20 字數 3425 閱讀 2921

隨著c#語言最新標準的出爐,現在它也提供了對可空型別的支援。這個小變化將會在處理那些包括可選項的資料庫記錄時非常有用。當然在其他地方,它也是非常有用的。

簡單說來,可空資料型別就是包含了所定義的資料型別或者值的空(null)的型別。c#的ecma-334標準提供了對所有c#值型別的可空版本的描述。

定義可空型別

定義可空型別和非可空型別基本類似,不同的是採用了?來表示。如定義乙個整型,你可以使用簡單的語句:

int myint = 1;

為了使得myint能夠儲存乙個空值,你可以這樣宣告它:

int? mynullableint = 1;

你可以看到,這兩個變數看上去好像是一樣的。但是,可空型別的版本是非常不同的。可空的版本事實上是乙個結構,它將值型別和乙個標記該值是否為空的標誌位結合在一起。乙個可空型別有兩個公共可讀的屬性,hasvalue和value。如果儲存了乙個值那麼hasvalue這個布林型變數就為true。否則,如果變數是空值就是false。如果hasvalue是true,你可以獲取這個變數的值。如下有兩個對可空變數的有效賦值:

double? mydouble = 3.1415926;

double? myotherdouble = null;

你可以看到,mydouble被賦值了,但是也可以被賦為空。在第二個語句裡,myotherdouble被初始化乙個空值,這在乙個非可空型別裡不能這樣做的。

使用可空型別

可空型別可以像普通值型別一樣的使用。事實上,可以使用內建的隱式轉換來轉換相同型別的可空變數和非可空變數。這意味著你可以在乙個標準整型和可空整型之間相互轉換:

int? nfirst = null; 

int second = 2;

nfirst = second; // 有效

nfirst = 123; // 有效

second = nfirst; // 同樣有效

nfirst = null; // 有效

second = nfirst; // 例外,後者是非空型別

在以上的語句裡,你可以看到如果可空變數不包含空值的話是可以和非可空變數交換值的。如果它是乙個空值,那麼就會丟擲例外。為了防止例外,你可以使用可空變數的hasvalue屬性:

if (nfirst.hasvalue) second = nfirst;

你可以看到,如果nfirst有值賦值就會發生,否則程式會跳過此句語句。

使用可空型別的操作符

雖然可以使用相同值型別的可空和非可空變數的轉換,也必須對操作符進行一些改變使得它們可以處理可空和非可空值。這些操作符被稱為提公升的操作符。

考慮如下**:

int vala = 10; 

int? valb = 3;

int? valc = vala * valb;

在valc裡儲存了什麼?valc中儲存了30。標準操作符被擴充套件使得它們能夠處理可空型別。考慮到如下的變化:

int vala = 10;

int? valb = null;

int? valc = vala * valb;

valc這次值為多少?valc為空。無論哪個運算元為空,提公升的操作符的結果為空。即使進行加法或減法,結果也為空。

如果valc不為可空型別呢?如下的**會有什麼樣的結果?

int vala = 10;

int? valb = null;

int valc = vala * valb; // valc 不為可空型別

**將會丟擲乙個異常。vala*valb結果為空,但是不能賦值為非可空型別,這將會導致程式異常的丟擲。

比較 比較將會和數學計算操作類似的方式處理。比較的運算元將同時被提公升為可空的。這樣就可以比較了,如果某個運算元為空,那麼比較結果為false。

如果對比是否相等,兩個同為空的變數將被認為是相等的。乙個空變數和其他任意值的變數相比的結果是不相等。下面是一些比較的例子:

int abc = 123;

int xyz = 890;

int? def = null;

int? uvw = 123;

comparison result

abc == xyz // false

abc == def // false

def == null // true

abc == uvw // true

uvw == null // false

uvw != null // true

在所有的比較中,結果都是布林型值true或者false。在做大小比較的時候,如果運算元的任意乙個或者都是空值,那麼結果返回的是false。如下展示了一些例子:

comparison result

abc > uvw // false, they are equal

abc < def // false, def is null

uvw < def // false, because def is null

def > null // false, because right side is null

uvw > null // false, because right side is null

可空性的移去

c#在新版本中加入了乙個新的操作符,它被稱為空接合操作符,使用如下的格式:

returnvalue = first second;

這樣,如果first不為空,那麼它的值將返回作為returnvalue的值。如果first為空,那麼second的值將被返回。注意:returnvalue可以為可空變數或者非可空變數。

如果你希望可空變數的值到乙個非可空的版本,你可以這樣做:

int? vala= 123;

int? valb = null;

int newvara = vala ?? -1;

int newvarb = valb ?? -1;

newvara的值將會為123因為vala不是空值。newvarb的值是-1因為valb是空值。你看一看到,這裡你將可以將變數從乙個空值轉化成乙個預設值。這裡預設值是-1。

結束語

總得來說,最新的c#允許乙個可空型別的存在。語言內部建立了對可空型別的處理機制。可空型別使得資料庫記錄和其他可選資訊更加的容易處理

VS2005中使用C 的新特性 可空型別

隨著c 語言最新標準的出爐,現在它也提供了對可空型別的支援。這個小變化將會在處理那些包括可選項的資料庫記錄時非常有用。當然在其他地方,它也是非常有用的。簡單說來,可空資料型別就是包含了所定義的資料型別或者值的空 null 的型別。c 的ecma 334標準提供了對所有c 值型別的可空版本的描述。定義...

VS2005中使用C 的新特性 可空型別

隨著c 語言最新標準的出爐,現在它也提供了對可空型別的支援。這個小變化將會在處理那些包括可選項的資料庫記錄時非常有用。當然在其他地方,它也是非常有用的。簡單說來,可空資料型別就是包含了所定義的資料型別或者值的空 null 的型別。c 的ecma 334標準提供了對所有c 值型別的可空版本的描述。定義...

VS2005中使用C 的新特性 可空型別

隨著c 語言最新標準的出爐,現在它也提供了對可空型別的支援。這個小變化將會在處理那些包括可選項的資料庫記錄時非常有用。當然在其他地方,它也是非常有用的。簡單說來,可空資料型別就是包含了所定義的資料型別或者值的空 null 的型別。c 的ecma 334標準提供了對所有c 值型別的可空版本的描述。定義...