1. 程式人生 > >C#(二)-【is和as】

C#(二)-【is和as】

概述

c# 中 is和as 操作符是用來進行強制型別轉換的。

is

is : 檢查一個物件是否兼容於其他指定的型別,並返回一個Bool值,永遠不會丟擲異常.

object o = new object();   
if (o is Label)  
{  
    Label lb = (Label)o;  
    Response.Write("型別轉換成功");  
}  
else  
{  
    Response.Write("型別轉換失敗");  
}   

在上面的程式碼,CLR(執行環境)實際上會檢查兩次物件的型別,is操作符先核實一次,如果o兼容於Lable,那麼在(Label)o時會再次核實一次,效率比較低,不建議使用。

as

as:與強制型別轉換是一樣的,但是永遠不會丟擲異常,即如果轉換不成功,會返回null

object o = new object();  
Label lb = o as Label;  
if (lb == null)  
{  
    Response.Write("型別轉換失敗");  
}  
else  
{  
    Response.Write("型別轉換成功");  
}   

在上面的程式碼中,CLR只會進行一次型別核實,效率要高於 is.

is和as

在學習C#時,看到這樣一種表達方式:
BAP_USER user = session[“User”] as BAP_USER;
if(user == null)
return mapping.FindForward(“error”);
有些不明白,上網查了些資料,對is和as操作符有了些瞭解,把資料放在這裡供學習和參考:
在C#中,所有的東西都是物件。因此任何常數也是一個整型物件。這裡用到了as ,as 是C#語言裡面的一個關鍵字。as 運算子類似於型別轉換,所不同的是,當轉換失敗時,as 運算子將產生空,而不是引發異常。在形式上,這種形式的表示式:
expression as type
as 運算子只執行引用轉換和裝箱轉換。
as 運算子無法執行其他轉換,如使用者定義的轉換,這類轉換應使用case表示式來代替其執行
關於is的其實也差不多,只是IS不會幫你進行任何的轉換。所以需要自已進行顯示轉換
is操作符進行轉換,它自動檢查時局是否和型別相容,並返回結果。而且它不會丟擲異常。如果物件引用為null,則is總返回false。

if (cls1 is Class2)  
   {      
  
         Class2 cls2 = (Class2)cls1;  
   }  
  
else  
      System.Console.WriteLine("Error 2!");   
as操作符進行轉換:

Class2 cls2 = cls1 as Class2;  
if (cls2!=null)  
     System.Console.WriteLine("Ok");  
else  
     System.Console.WriteLine("Error!");   

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

總結

C#是一門強型別語言,一般情況下最好避免將一個型別轉換成另一個型別,但是有些時候又不得不進行型別轉換。