在C#x的版本中一個值類型變量是不可以被賦予null值的否則會產生異常在C#中微軟提供了Nullable類型允許用它定義包含null值(即空值)的數據類型這對處理數據庫中包含可選字段以及很多方面都有很大幫助
定義Nullable類型
定義一個nullable類型非常類似於定義一個非nullable類型不同之處在於使用類型修飾符?比如定義一個整型如下
int myInt = ;要使一個整型變量可以存儲一個null值可以如下聲明
int? myNullableInt = ;這兩個變量看起來似乎是一樣的但事實並非如此實際上Nullable類型是一個結構體它有兩個公開可讀字段HasValue和ValueHasValue是一個布爾值當有值存儲時它為真當變量值為null時HasValue為假當HavValue為真是時可以取得變量的值為假時當嘗試取得變量的值時會拋出一個異常
現在null是C#的一個關鍵字它可以被賦給一個Nullable型變量下面是對Nullable型變量賦值的兩種有效方式
double? myDouble = ;double? myOtherDouble = null;可以看到myDouble被賦給一個值它也可以被賦以null在第二個語句中myOtherDouble被初始化為null——在一個非Nullable型變量中這樣做會產生異常
使用nullable類型 一個Nullable型變量可以像一般值類型那樣使用在編譯過程中Nullable型變量和非Nullable型變量會進行隱式田轉換就是說我們可以把一個標准整型賦給一個整型Nullable變量反之亦然參考下面示例代碼
int? nFirst = null;
int Second = ;
nFirst = Second;
// 可以
nFirst = ;
// 可以
Second = nFirst;
//也可以因為此時nFirst== nFirst = null;
// 可以
Second = nFirst;
// 拋出異常 Second 是一個非nullable型變量
可以看到只要一個Nullable型變量的值不是null它就可以和一個非Nullable型變量交換變量的值如果包含null值
就會拋出異常為避免異常發生可以利用Nullable型變量的HasValue屬性 if (nFirstHasValue) Second = nFirst;
如上所示如果nFirst 含有一個值這個賦值語句就會運行否則就會跳過
在Nullable值中使用操作符Lifed Operators【】 兩個相同類型的Nullable型和非Nullable型變量除了可以相互自動轉化之外還可以通過操作符在它們中進行操作參考下面代碼
int ValA = ;
int? ValB = ;int? ValC = ValA * ValB;
//ValC== int ValA = ;
int? ValB = null;int? ValC = ValA * ValB;
//ValC==null int ValA = ;
int? ValB = null;int? ValC = ValA + ValB;
//ValC仍然是null;
進入討論組討論
可以看到兩個操作數只要有任何一個是null得到的結果也一定是null不管是加減還是乘除當然如果操作數不是null 則結果還是按原來操作符運算得到的結果
在上面的代碼中如果ValC不是Nullable類型情況會怎麼樣呢?如以下代碼
int ValA = ;
int? ValB = ;
int ValC = ValA * ValB;
// ValC 不是Nullable類型上面這段代碼會拋出一個異常
ValA * ValB的結果是null
它不能被賦給一個非Nullable變量ValC
因為
會產生異常
關系運算
兩個都是null值的Nullable變量被認為是相等的而一個值為null的變量和其它任何非null值的變量都是不相等的如下面示例代碼
int abc = ;
int xyz = ;
int? def = null;
int? uvw = ;
Comparison
Result abc == xyz
// false abc == def
// false def == null
// true
abc == uvw
// true uvw == null
// false uvw != null
// true
在其它關系運算中
如果其中一個或兩個操作數為null
則結果一定是false
如下面示例代碼(仍然使用上面定義的變量)
Comparison Resultabc >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為非null則first的值會被賦給returnValue如果first為null則second會被賦給returnValue注returnValue可以是Nullable類型也可以是非Nullable類型 如果要將一個Nullable變量的值賦給一個非Nullable變量可以用下面方法
int? ValA= ;
int? ValB = null;
int NewVarA = ValA ?? ;
int NewVarB = ValB ?? ;
上面這段代碼運行完以後NewVarA的值為因為ValA的值不是null而NewVarB值變為 因為ValB為null這就允許我們利用一個null值將一個變量轉變成一個默認值在上面的代碼中這個默認值為
From:http://tw.wingwit.com/Article/program/net/201311/11328.html