C 問號的細節

2022-04-30 22:03:20 字數 1844 閱讀 3859

我想你一定寫過下面這樣類似的**:

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 可空型別修飾符 引用型別可以使用空引用表示乙個不存在的值,而值型別...