我想你一定寫過下面這樣類似的**:
string
strparam
=request.params[
"param"];
if( strparam
==null
)或者這樣的**:
string
strparam
=request.params[
"param"]
==null?""
: request.params[
"param"];
你發現,儘管實現的同乙個功能,但第二段**要比第一段**是不是更簡潔。這裡的」 ?:「就是乙個三元的操作符。利用這個三元操作符也稱條件操作符,就很簡單的把乙個if語句給實現了。
在使用條件操作符的時候要注意,假定條件表示式是這樣 x?y:z,表示式型別的只能是使y 和z的變數型別之一,換句話說就是
y和z的變數型別決定這個條件表示式的型別,無論y和z是同一型別,還是y和z不是同一型別。
如果表示式的型別和賦值型別不一致,發生編譯時錯誤 ,例如:如果你想實現如下**:
string
strtemp ;
object
obj;
.if(strtemp
==""
)obj
=dbnull.value;
else
obj
=strtemp ;
然後為了簡單,改成下面這種形式:
string
strtemp;
object
obj
=strtemp
==""
?dbnull.value:strtemp;
你編譯的時候,會報錯。因為dbnull和string之間沒隱式轉換,修改成如下**就可以了:
object
obj
=strtemp
==""
?dbnull.value: (
object
)strtemp;
另外條件操作符是向右關聯的,從左到右進行計算,於是a?b:c?d:e 應理解為 a?b:(c?d:e)。
上面提到了dbnull,在c#2.0裡面實現了nullable資料型別,別小看這個資料型別,其實非常有用,從此我們就可以放棄對object 資料進行 if(object==null)這樣的判斷了。同時你會發現,在資料庫應用上,資料庫中有的字段允許取空值,在c#世界中引入nullable型別正好 與之對應,,從(c#)物件對映到關聯式資料庫物件,或者反過來,轉換都是比較平滑。如果你想進一步了解nullable資料型別可以去查msdn(ms- help: . 為了實現nullable資料型別轉換成non-nullable型資料,就有了乙個這樣的操作符」??(兩個問號)「,雙問號操作符意思是取所賦值??左邊的,如果左邊為null,取所賦值??右邊的,比如int y = x ?? -1 如果x為空,那麼y的值為-1.
於是這時候就可以把最上面第二段**改成:
string
strparam
=request.params[
"param"]
??""
;嘿嘿,是不是更簡潔了。
另外還有」?(單問號)「修飾符,是 system.nullable的縮寫形式,比如int?代表是可空的整形,例如:int? a = 1 或者 int? b=null。nullable型別具有乙個hasvalue的bool型別唯讀屬性,當nullable型別例項的該屬性為true時,則表示該例項是 非空例項,包含乙個已知值value,hasvalue為false時,訪問value屬性將導致 system.invalidoperationexception。
怎麼樣?這裡有關「?」號的細節,就不單單關注問號本身了。
c 的細節 一 問號的細節
寫在最前面的話 c 的細節 是我當初學習c 時候,做的一些學習筆記的整理,現在回頭看來這些都是非常淺顯的知識,是c 非常細節的地方,同時也是不能忽略的地方,細節決定成敗 也許有些嚴重。我希望把這些整理出來,可以給初學者乙個參考,也給自己乙個溫故知新的機會。高手就不必花時間來看了。我想你一定寫過下面這...
C 單問號( )與雙問號( )
1.單問號 1.1 單問號運算子可以表示 可為null型別,c 2.0裡面實現了nullable資料型別 a.比如下面一句,直接定義int為null是錯誤的,錯誤提示為無法將null轉化成int,因為後者是不可以為null的值型別。private int getnum null b.如果修改為下面的...
C 中的?問號
如果你看到c 中的 問號腦袋裡便充滿問號,那麼這個貼子便是為你而寫的。有人說 細節決定成敗 細節就意味著繁瑣,像我這樣浮躁的人現在都已經習慣了繁瑣,如果你還不習慣繁瑣的話,那麼就把這個貼子當作一次練習機會吧。在c 中 有三種用法。1 可空型別修飾符 引用型別可以使用空引用表示乙個不存在的值,而值型別...