這篇文章主要介紹了c#中is與as的區別,較為詳細的分析了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,因為沒有物件可以檢查其型別。
例如 **如下:
object o = new object();
if (o is label)
else
三、c#中as的轉換規則
1、檢查物件型別的相容性,並返回轉換結果,如果不相容則返回null;
2、不會丟擲異常;
3、如果結果判斷為空,則強制執行型別轉換將丟擲nullreferenceexception異常;
4、用as來進行型別轉換的時候,所要轉換的物件型別必須是目標型別或者轉換目標型別的派生型別
例如 **如下:
object o = new object();
label lb = o as label;
if (lb == null)
else
使用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 中String與string的區別分析
一 區別分析 string 類,system.string string 型別,變數 兩者本質上yfsyvbtck沒有任何區別,都是system.string,string只是system.string的別名而已 唯一的區別在於如何按照 約定的來寫,如宣告變數時使用小寫string,使用system...
C 中類與結構的區別例項分析
一 基本概念 類 引用型別,儲存在堆中,棧中儲存引用位址,在方法的傳輸中只是傳輸位址的引用,修改指向的物件會影響原有物件的值,傳輸中消耗記憶體小。結構 值型別,儲存在堆疊中,傳輸過程中傳輸整個物件的副本,修改指向物件的值不會影響原有的物件,傳輸中消耗記憶體大。二 例項 如下 class progra...
C 中 與 的區別
看過一些文章,關於這個的簡單而容易被忽略的語法,說的總有點瑕疵。貼 15秒之內應該能知道c 中乙個 和兩個 的區別,開始計數了.5秒看 namespace test927demo onemethod twomethod console.writeline c 乙個 符號的作用是 console.wr...