1.在c#2.0之前,as只能用於引用型別。而在c#2.0之後,它也可以用於可空型別。其結果為可空型別的某個值---空值或者乙個有意義的值。示例:
1static
void main(string
args)26
7static
void printvalueint32(objecto)8
輸出:
這樣只需要一步,就可以安全的將任意引用型別轉換為值型別。而在c#1.0中,你只能先使用is操作符,然後再輕質轉換,這使clr執行兩次的型別檢查,顯然is和強型別轉換不夠優
雅。2.我一直以為執行一次的檢查會比兩次快。實際上真的如此嗎?那就來測試一下吧。
1輸出:static
void main(string
args)210
11 stopwatch watch = new stopwatch(); //
測試時間類
12watch.start();
13foreach (var item in
listobj)
1419}20
watch.stop();
21 console.writeline("
", watch.elapsed);
2223
watch.reset();
24watch.start();
25foreach (var item in
listobj)
2632}33
watch.stop();
34 console.writeline("
", watch.elapsed);
35console.readkey();
36 }
從輸出的結果看,使用is檢查和強型別轉換時間比as轉換時間少很多。在進行要頻繁在引用型別和值型別之間轉換的操作時,謹慎選擇,避免掉入效能陷阱。
3.對於空合併運算子的使用。
空合併運算子實在c#2.0中引入的。first??second其執行步驟:
(1)對first進行求值。
(2)first非空,整個表示式的值就是first的值。
(3)否則,求second的值,作為整個表示式的值。
**示例一,first不為空時,不管second的值是否為空,整個表示式的值都是first的值:
1輸出:(即使second不是空,因為first非空,所以輸出first的值)int? first = 1;2
int? second = 4;3
int? temp = first ??second;
4 console.writeline("
", (temp.hasvalue ? temp.value.tostring() : "
null
"));
**示例二,first為空時,second的值整個表示式的值。
1輸出:int? first = null;2
int? second = 4;3
int? temp = first ??second;
4 console.writeline("
", (temp.hasvalue ? temp.value.tostring() : "
null
"));
可選型別以及型別轉換
乙個變數要麼有值,要麼沒值。語法定義 let name string?nil。只有可選型別的可以賦值nil。怎麼使用 var num int?0 num nil if num nilvar num int?0 num nil if let result numfunc check number in...
C 型別轉換和引用轉換
物件的引用可以被 向上轉換是指乙個從乙個基類指向乙個子類 house house new house asset asset house house類是asset的子類 這個時候隱式的向上轉換就發生了 asset類的乙個物件asset指向了它的子類house的物件house console.writ...
C 算術型別轉換和賦值型別轉換
運算過程中,當參與運算的運算元型別不同時,可進行型別轉換。包括 自動轉換 和強制轉換 自動型別轉換指在算術運算以及在賦值過程中,如果運算子兩邊的運算元屬於 型別相容 指型別不同但系統可以自動進行轉換 的情況,如整數 字元和實數之間,系統會自動進行型別轉換,然後再做運算。包括 算術型別轉換 賦值型別轉...