C 型別轉換 is as 單問號 雙問號解密

2021-09-08 09:24:18 字數 1440 閱讀 4113

在c#中型別的轉換分兩種:顯式和隱式,基本的規則如下。

基類物件轉化為子類物件,必須顯式轉換,規則:(型別名)物件。

值型別和引用型別的轉換採用裝箱(boxing)或拆箱(unboxing)。

子類轉化為基類物件。

基本型別互相之間轉化可以用convert類來實現。

字串型別轉換為對應的基本型別用parse方法,除了string型別外其他的型別都可以用parse方法。

用gettype可以取得物件的精確型別。

子類轉化為基類,採用隱式轉換。

下面來說說as和is操作符。

as在轉換的同時兼判斷相容性,如果無法進行轉換,則as返回null(沒有產生新的物件)而不是引發異常。有了as我想以後就不要再用try-catch來做型別轉換的判斷了。因此as轉換成功要判斷是否為null。

as是引用型別型別的轉換或者裝箱轉換,不能用與值型別的轉換。如果是值型別只能結合is來強制轉換。

object objtest = 11; 

if( objtest is

int)

is只是做型別相容判斷,並不執行真正的型別轉換。返回true或false,不會返回null,物件為null也會返回false。

as模式的效率要比is模式的高,因為借助is進行型別轉換的化,需要執行兩次型別相容檢查。而as只需要做一次型別相容,一次null檢查,null檢查要比型別相容檢查快。

在資料型別轉換中,c#相對其它語言來說是比較嚴格的,要求顯式進行資料轉化。

為了操作方便,c#也提供了一種is操作符進行轉換,十分方便,它自動檢查時局是否和型別相容,並返回結果。而且它不會丟擲異常。如果物件引用為null,則is總返回false。  

if (cls1 is

class2)

else

system.console.writeline(

"error 2!

");

平時自己也多用這種方式來做型別轉化的,但今天看了個文章,對比了另外一種方式,as操作符進行轉換,才知道as比is可以稍微地提高效能的。

class2 cls2 = cls1 as

class2;

if (cls2!=null

) system.console.writeline("ok

");else

system.console.writeline(

"error!

");

as稍微不同,它檢查引用物件是否相容,如果不相容則返回null,因此需要做null的判斷。

對比兩種方式,is需要做兩次物件的型別檢查,而as需要做一次物件型別檢查,再加一次null的檢查,而null檢查開銷比物件型別檢查少。相對as的方法效率高些。

c#中問號的用法(非表示式):單問號,雙問號。

**:

C 單問號( )與雙問號( )

1.單問號 1.1 單問號運算子可以表示 可為null型別,c 2.0裡面實現了nullable資料型別 a.比如下面一句,直接定義int為null是錯誤的,錯誤提示為無法將null轉化成int,因為後者是不可以為null的值型別。private int getnum null b.如果修改為下面的...

C 單問號( )和雙問號( )用法。

1 單問號 作用 用於給變數設初化的時候,給變數 int型別 賦為null值,而不是0。例子 public int a 預設值為0 public int b 預設值為null 參考 2 雙問號 作用 用於判斷並賦值,先判斷當前變數是否為null,如果是就可以賦乙個新值,否則跳過。例子 public ...

C 單問號和雙問號的使用

有時int型別的值可能為空,但int型別不能是string型別。用下列方法解決這個問題private int?getnum null 在控制台輸出getnum,若getnum值為空字串,則輸出0。語句如下。用來判斷getnum值是否為null。console.writeline getnum?0 下...