C 可空型別與空合併操作符

2021-08-09 09:30:10 字數 2093 閱讀 8565

讓我們先來看一段簡單**:

datetime date=new datetime();

console.writeline(date.tostring());

int myint = new int();

console.writeline(myint.tostring());

double mydouble = new double();

console.writeline(mydouble.tostring());

執行結果沒有出乎大家意料,控制台輸出如下

通過上述方式,不難知道datetime、double、int等值型別的預設值如何獲取。從而發現值型別的值是乙個實實在在的數(因為即使是0,也是有效數),當然,並非說引用型別的數就不實在了。主要是想說明值型別不能為空

從上圖可以看出,string賦值空是合法的,而datetime取值null編譯器會報錯。然而,有時候我們需要將一些型別去空,因為存在實際的意義。例如在商務應用程式中,乙份訂單已被下單,但是它沒有發貨,與之對應,有個發貨日期匹配,顯然,如果datetime取值null的話,會具有實際意義(很明顯編譯器不允許,所以也可以設定乙個特定的非空值,代表沒有發貨,卻很彆扭)。為了解決這個問題,我們將引入可空型別。顧名思義,可空型別,是可以取到空值null的。

以byte型別為例,使之既可以取值常規意義下的0-255,也能取值空(null)。

nullablenullbyte = new byte();

console.writeline("預設值:",nullbyte);

nullbyte = null; //將之賦值為null

if (nullbyte == null)

執行結果:

利用nullable宣告,可以使byte成為可空型別,可以取值到空,但它的預設值與非可空byte型別一樣,均是0。

細心的朋友能夠發現更簡單的什麼可空型別申明方法。

大家能夠發現,當游標停在我們通過nullable定義的可空byte型別nullbyte變數上,編譯器會出現「(區域性變數)byte?nullbyte」提示,有個問號,所以我們能夠依據此定義可空型別,下面對上述**進行修改

byte? nullbyte = new byte();

console.writeline("預設值:",nullbyte);

nullbyte = null; //將之賦值為null

執行後我們發現兩段**效果是一樣的。實際上"nullablenullbyte = new byte();"與「byte? nullbyte = new byte();」是完全等效的方法。個人更偏向於後者定義方法,因為與常規的非空byte型別定義一致,只是在byte關鍵字後面加個問號即可完成可空型別的宣告。

空合併操作符是兩個問號組成的:??。

用法規則:first??second,先對first進行求值,如果非空,則結果就是整個表示式的結果,否則求second值,其結果作為整個表示式的結果。

int? a = 1;

int b = 2;

int c = a ?? b;

很顯然將1賦值給變數c,於是c=1。值得注意的是,儘管c是非可空int型別,我們還是對c直接賦值,因為b是非可空的。假設a=null,將會是b作為整個表示式的值(second部分),最終得到的是乙個非可空結果。

C 其它特性(可空型別,空合併操作符,匿名方法)

1.可空型別 表示在值型別的正常取值範圍內再加上乙個null值 1 結構 可空型別是泛型結構nullable的例項,其宣告為 public struct nullablewhere t struct,語法t?是nullable的簡寫形式,這兩種形式是等效的 nullablemynullableint...

可空型別修飾符與空合併運算子

可以讓乙個值型別賦值為null,例如給乙個struct賦值為null或判斷乙個struct是否被賦過值 if m teststruct null 單問號 宣告該值型別為可空型別 宣告乙個可空型別有以下三種方式 int a null int b newint?nullable int c newnul...

C 可空型別

可空型別只能用於值型別,不能用於引用型別,引用型別本身支援null值。如果直接把null賦值給int型別,會出現乙個錯誤 無法將 null 轉換成 int 因為它是一種值型別 賦值時應該使用 int?a null 可空型別與一元或二元運算子一起使用是,如果乙個運算元或兩個運算元都是null,其結果為...