C 型別轉換is和as 以及效能陷阱

2022-01-30 09:46:47 字數 2112 閱讀 2024

1.在c#2.0之前,as只能用於引用型別。而在c#2.0之後,它也可以用於可空型別。其結果為可空型別的某個值---空值或者乙個有意義的值。

示例:

1

static

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

int? first = 1;2

int? second = 4;3

int? temp = first ??second;

4 console.writeline("

", (temp.hasvalue ? temp.value.tostring() : "

null

"));

輸出:(即使second不是空,因為first非空,所以輸出first的值)

**示例二,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 算術型別轉換和賦值型別轉換

運算過程中,當參與運算的運算元型別不同時,可進行型別轉換。包括 自動轉換 和強制轉換 自動型別轉換指在算術運算以及在賦值過程中,如果運算子兩邊的運算元屬於 型別相容 指型別不同但系統可以自動進行轉換 的情況,如整數 字元和實數之間,系統會自動進行型別轉換,然後再做運算。包括 算術型別轉換 賦值型別轉...