C#操作符??和?:
先看如下代碼:
string?strParam = Request.Params["param"];
if?( strParam==?null?)
{
strParam=?"";
}
string?strParam=
Request.Params["param"] ==?null???"": Request.Params["param"];
你發(fā)現(xiàn),盡管實(shí)現(xiàn)的同一個(gè)功能,但第二段代碼要比第一段代碼是不是更簡(jiǎn)潔。
這里的” ?:“就是一個(gè)三元的操作符。利用這個(gè)三元操作符也稱條件操作符,
就很簡(jiǎn)單的把一個(gè)if語(yǔ)句給實(shí)現(xiàn)了。
在使用條件操作符的時(shí)候要注意,假定條件表達(dá)式是這樣 x?y:z,
表達(dá)式類型的只能是使y 和z的變量類型之一,換句話說(shuō)就是 y和z的變量類型決定這個(gè)條件表達(dá)式的類型,
無(wú)論y和z是同一類型,還是y和z不是同一類型。 如果表達(dá)式的類型和賦值類型不一致,發(fā)生編譯時(shí)錯(cuò)誤 ,例如:如果你想實(shí)現(xiàn)如下代碼:
string?strTemp ;
object?obj;
....
if(strTemp ==??"")
obj?? =?? DBNull.Value;
else
obj?? =?? strTemp ;
然后為了簡(jiǎn)單,改成下面這種形式:
string?strTemp;
object?obj = strTemp ==?""?DBNull.Value:strTemp;
你編譯的時(shí)候,會(huì)報(bào)錯(cuò)。因?yàn)镈BNull和string之間沒(méi)隱式轉(zhuǎn)換,修改成如下代碼就可以了:
object?obj = strTemp ==?""? DBNull.Value: (object)strTemp;
另外條件操作符是向右關(guān)聯(lián)的,從左到右進(jìn)行計(jì)算,于是a?b:c?d:e 應(yīng)理解為 a?b:(c?d:e)。
上面提到了DBNull,在c#2.0里面實(shí)現(xiàn)了Nullable數(shù)據(jù)類型,別小看這個(gè)數(shù)據(jù)類型,其實(shí)非常有用,
從此我們就可以放棄對(duì)object數(shù)據(jù)進(jìn)行?if(object==null)這樣的判斷了。同時(shí)你會(huì)發(fā)現(xiàn),
在數(shù)據(jù)庫(kù)應(yīng)用上,數(shù)據(jù)庫(kù)中有的字段允許取空值,在C#世界中引入nullable類型正好與之對(duì)應(yīng)
,從(C#)對(duì)象映射到關(guān)系數(shù)據(jù)庫(kù)對(duì)象,或者反過(guò)來(lái),轉(zhuǎn)換都是比較平滑。
為了實(shí)現(xiàn)Nullable數(shù)據(jù)類型轉(zhuǎn)換成non-Nullable型數(shù)據(jù),就有了一個(gè)這樣的操作符”??(兩個(gè)問(wèn)號(hào))“,雙問(wèn)號(hào)操作符意思是取所賦值??左邊的,如果左邊為null,取所賦值??右邊的,
比如int?y = x ?? -1 如果x為空,那么y的值為-1.
于是這時(shí)候就可以把最上面第二段代碼改成:
string?strParam= Request.Params["param"]???"";
嘿嘿,是不是更簡(jiǎn)潔了。
另外還有”?(單問(wèn)號(hào))“修飾符,是System.Nullable的縮寫形式,比如int?代表是可空的整形,
例如:int? a = 1 或者?int? b=null。Nullable類型具有一個(gè)HasValue的bool類型只讀屬性,
當(dāng)Nullable類型實(shí)例的該屬性為true時(shí),則表示該實(shí)例是非空實(shí)例,包含一個(gè)已知值Value,
HasValue為false時(shí),訪問(wèn)Value屬性將導(dǎo)致System.InvalidOperationException。
轉(zhuǎn)載于:https://www.cnblogs.com/ChineseMoonGod/p/6909839.html
總結(jié)
以上是生活随笔為你收集整理的C#操作符??和?:的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: extract-text-webpack
- 下一篇: bootstrap-动画过渡