類型轉換(C# AS OR IS ?運算符)

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

1、基類對象轉化爲子類對象,必須顯式轉換,規則:(類型名) 對象。
2、值類型和引用類型的轉換採用裝箱(boxing)或拆箱(unboxing).

3、子類轉化爲基類對象。
4、基本類型互相之間轉化可以用Covent類來實現。
5、字符串類型轉換爲對應的基本類型用Parse方法,除了String類型外其他的類型都可以用Parse方法。
6、用GetType可以取得對象的精確類型。
7、子類轉化爲基類,採用隱式轉換。

 

 下面來說說AS和IS操作符。
AS:用於在兼容的引用類型之間執行轉換。
IS:檢查對象是否與給定類型兼容

 

從概念來分析:
1、AS在轉換的同事兼判斷兼容性,如果無法進行轉換,則 as 返回 null(沒有產生新的對象)而不是引發異常。有了AS我想以後就不要再用try-catch來做類型轉換的判斷了。因此as轉換成功要判斷是否爲null。
2、AS是引用類型類型的轉換或者裝箱轉換,不能用與值類型的轉換。如果是值類型只能結合is來強制轉換,代碼如下:
object bjTest = 11;

if( objTest is int )

{
   int nValue = (int )objTest;

}

 

3、IS只是做類型兼容判斷,並不執行真正的類型轉換。返回true或false,不會返回null,對象爲null也會返回false。
4、AS模式的效率要比IS模式的高,因爲藉助IS進行類型轉換的化,需要執行兩次類型兼容檢查。而AS只需要做一次類型兼容,一次null檢查,null檢查要比類型兼容檢查快。

 

在數據類型轉換中,C#相對其它語言來說是比較嚴格的,要求顯式進行數據轉化。
 爲了操作方便,C#也提供了一種is操作符進行轉換,十分方便,它自動檢查時局是否和類型兼容,並返回結果。而且它不會拋出異常。如果對象引用爲null,則is總返回false。
 if (cls1 is Class2) 
            {
                 Class2 cls2 = (Class2)cls1;
          }
            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#中問號的用法(非表達式)---單問號,雙問號

單問號---用於給變量設初值的時候,給變量(int類型)賦值爲null,而不是0!

雙問號---用於判斷並賦值,先判斷當前變量是否爲null,如果是就可以賦一個新值,否則跳過!
public int? para;
//public int para;如果不註釋掉此行,而把上一行註釋掉的話,下面會報錯!
public int par()
{
  return this.para ?? 0;
}

發佈了9 篇原創文章 · 獲贊 0 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章