程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#中is、as的區別,

C#中is、as的區別,

編輯:C#入門知識

C#中is、as的區別,


一、C#類型的轉換

 

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


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


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

 

二、C#中的is 

 

檢查一個對象是否兼容於其他指定的類型,並返回一個Bool值,如果一個對象是某個類型或是其父類型的話就返回為true,否則的話就會返回為false。永遠不會拋出異常

如果對象引用為null,那麼is操作符總是返回為false,因為沒有對象可以檢查其類型。

例如

 

C# 代碼   復制

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

 

三、C#中as的轉換規則 
 

1、檢查對象類型的兼容性,並返回轉換結果,如果不兼容則返回null;


2、不會拋出異常;


3、如果結果判斷為空,則強制執行類型轉換將拋出NullReferenceException異常;

4、用as來進行類型轉換的時候,所要轉換的對象類型必須是目標類型或者轉換目標類型的派生類型

例如

  C# 代碼   復制

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

 

使用as操作符有如下幾點限制
 

第一個就是,不用在類型之間進行類型轉化,即如下編寫就會出現編譯錯誤。

NewType newValue = new NewType();
NewType1 newValue = newValue as NewType1;
 

第二個就是,不能應用在值類型數據,即不能如下寫(也會出現編譯錯誤)。


object objTest = 11;
int nValue = objTest as int;

 

四、as與is的區別

 

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


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

3、IS只是做類型兼容判斷,並不執行真正的類型轉換。返回true或false,不會返回null,對象為null也會返回false。


4、AS模式的效率要比IS模式的高,因為借助IS進行類型轉換的化,需要執行兩次類型兼容檢查。而AS只需要做一次類型兼容,一次null檢查,null檢查要比類型兼容檢查快。
 

 

五、在進行類型轉換的時候,可以按照如下的方式進行選擇
 

1、Object => 已知引用類型
使用as操作符來完成

2、Object => 已知值類型
先使用is操作符來進行判斷,再用類型強轉方式進行轉換

3、已知引用類型之間轉換
首先需要相應類型提供轉換函數,再用類型強轉方式進行轉換

4、已知值類型之間轉換
最好使用系統提供的Convert類所涉及的靜態方法

 

六、(int)和Int32.Parse(),Convert.ToInt32()三者的區別

 

1、(int)轉換:用在數值范圍大的類型轉換成數值范圍小的類型時使用,但是如果被轉換的數值大於或者小於數值范圍,則得到一個錯誤的結果,利用這種轉換方式不能將string轉換成int,會報錯。

2、Int32.Parse()轉換:在符合數字格式的string到int類型轉換過程中使用,並可以對錯誤的string數字格式的拋出相應的異常。

3、Convert.ToInt32()轉換:使用這種轉換,所提供的字符串必須是數值的有效表達方式,該數還必須不是溢出的數。否則拋出異常。


C語言中 ^怎使用

a1 = 0x01; //0000 0001
a2 = 0x00; //0000 0000
a3 = 0x03; //0000 0011
a4 = 0x02; //0000 0010

b1 = a1 ^ a2; //0000 0001
b2 = a1 ^ a3; //0000 0010
b3 = a1 ^ a4; //0000 0011

^異或運算符,位值相同為0,不同為1,見上示例.

//
簡單實際問題舉例:
======\=======\=======
======a=======b=======
上面是2條電路,2個開關分別為a和b,打開狀態:\[1],關閉狀態:/[0].
若同時打開或者關閉,兩條電路均不通.
若a打開[1],b關閉[0],電路1通電
======\=======/=======
若a關閉[0],b打開[1],電路2通電
======/=======\=======
綜上,電路在a,b狀態相同時不通[0],在a,b不同時通電[1].
 

C語言中 ^怎使用

a1 = 0x01; //0000 0001
a2 = 0x00; //0000 0000
a3 = 0x03; //0000 0011
a4 = 0x02; //0000 0010

b1 = a1 ^ a2; //0000 0001
b2 = a1 ^ a3; //0000 0010
b3 = a1 ^ a4; //0000 0011

^異或運算符,位值相同為0,不同為1,見上示例.

//
簡單實際問題舉例:
======\=======\=======
======a=======b=======
上面是2條電路,2個開關分別為a和b,打開狀態:\[1],關閉狀態:/[0].
若同時打開或者關閉,兩條電路均不通.
若a打開[1],b關閉[0],電路1通電
======\=======/=======
若a關閉[0],b打開[1],電路2通電
======/=======\=======
綜上,電路在a,b狀態相同時不通[0],在a,b不同時通電[1].
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved