先看如下**:
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資料型別轉換成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語言 位操作符和邏輯操作符
按位與 按位或 按位異或 注 他們的運算元必須是整數。兩個整數字元位有假 0 就為假 0 只有全為真 1 就為真 1 舉個例子 老師叫兩個學生來辦公室,說張三與 李四過來,如果只乙個人過去就不滿足老師說的話 為假 必須兩個人都過去 為真 兩個整數字元位只要有真就為真,只有全為假 0 就為假 0 舉個...
c語言操作符 位操作符 移位操作符
1 按位操作符 1.1 按位 與 雙目運算子 僅當兩個運算元都為1時,結果為1,否則為0。參與運算的數以補碼方式出現。例 9 5 1 0000 1001 9的補碼 0000 0101 5的補碼 0000 0001 1的補碼 應用 a 通常將某些位清零或保留某些位。例如 將a的高八位清零,保留低八位,...
C 中is和as操作符
在c 語言中進行型別轉換的操作符is和as。is和as都是強制型別轉換,但這兩者有什麼相同之處和不同之處呢?在使用is和as需要注意哪些事項?下面我們從簡單的 示例去 這個簡單的問題。is檢查乙個物件是否相容於指定的型別,並返回乙個boolean值 true或者fasle。注意,is操作符永遠不會丟...