寫在最前面的話:
《c#的細節》是我當初學習c#時候,做的一些學習筆記的整理,現在回頭看來這些都是非常淺顯的知識,是c#非常細節的地方,同時也是不能忽略的地方,」細節決定成敗「,也許有些嚴重。我希望把這些整理出來,可以給初學者乙個參考,也給自己乙個溫故知新的機會。高手就不必花時間來看了。;-)
———————————————————————————-
我想你一定寫過下面這樣類似的**:
或者這樣的**:string strparam = request.params["param"];if ( strparam== null )
你發現,儘管實現的同乙個功能,但第二段**要比第一段**是不是更簡潔。這裡的」 ?:「就是乙個三元的操作符。利用這個三元操作符也稱條件操作符,就很簡單的把乙個if語句給實現了。string strparam=request.params["param"] == null ? "": request.params["param"];
在使用條件操作符的時候要注意,假定條件表示式是這樣 x?y:z,表示式型別的只能是使y 和z的變數型別之一,換句話說就是
y和z的變數型別決定這個條件表示式的型別,無論y和z是同一型別,還是y和z不是同一型別。
如果表示式的型別和賦值型別不一致,發生編譯時錯誤 ,例如:如果你想實現如下**:
然後為了簡單,改成下面這種形式:string strtemp ;object obj;
....
if(strtemp == "")
obj = dbnull.value;
else
obj = strtemp ;
你編譯的時候,會報錯。因為dbnull和string之間沒隱式轉換,修改成如下**就可以了:string strtemp;object obj = strtemp == ""?dbnull.value:strtemp;
另外條件操作符是向右關聯的,從左到右進行計算,於是a?b:c?d:e 應理解為 a?b:(c?d:e)。object obj = strtemp == ""? dbnull.value: (object)strtemp;
上面提到了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。
怎麼樣?這裡有關「?」號的細節,就不單單關注問號本身了
永久鏈結(permalink):
C 問號的細節
我想你一定寫過下面這樣類似的 string strparam request.params param if strparam null 或者這樣的 string strparam request.params param null?request.params param 你發現,儘管實現的同乙個...
C 的一些細節
1.c 中,將負數賦值給unsigned是完全合法的。例如,將 1賦值給unsigned char,那麼結果是255.2.c 中,double的精度和計算速度都要超過float,long double則需要承擔額外的執行代價。3.std ou t hi d endl 等價於std out hi 4....
C 除法的細節
最近在做專案時有個地方用到了概率,要計算概率自然會用到除法。我這邊概率的演算法是這樣的,從0到10000獲取個隨機數,隨機值除以10000就是概率了,但是一時大意沒注意細節,結果直接除了,如下 random rdo new random intintnum rdo.next 0,10000 floa...