C#中is與as的區(qū)別分析
本文實(shí)例分析了C#中is與as的區(qū)別,分享給大家供大家參考。具體分析如下:
一、C#類型的轉(zhuǎn)換
在c#中類型的轉(zhuǎn)換分兩種:顯式和隱式,基本的規(guī)則如下:
1、基類對(duì)象轉(zhuǎn)化為子類對(duì)象,必須顯式轉(zhuǎn)換,規(guī)則:(類型名) 對(duì)象。
2、值類型和引用類型的轉(zhuǎn)換采用裝箱(boxing)或拆箱(unboxing).
3、子類轉(zhuǎn)化為基類對(duì)象。
4、基本類型互相之間轉(zhuǎn)化可以用Covent類來(lái)實(shí)現(xiàn)。
5、字符串類型轉(zhuǎn)換為對(duì)應(yīng)的基本類型用Parse方法,除了String類型外其他的類型都可以用Parse方法。
6、用GetType可以取得對(duì)象的精確類型。
7、子類轉(zhuǎn)化為基類,采用隱式轉(zhuǎn)換。
二、C#中的is
檢查一個(gè)對(duì)象是否兼容于其他指定的類型,并返回一個(gè)Bool值,如果一個(gè)對(duì)象是某個(gè)類型或是其父類型的話就返回為true,否則的話就會(huì)返回為false。永遠(yuǎn)不會(huì)拋出異常
如果對(duì)象引用為null,那么is操作符總是返回為false,因?yàn)闆](méi)有對(duì)象可以檢查其類型。
例如
if (o is Label)
{
Label lb = (Label)o;
Response.Write("類型轉(zhuǎn)換成功");
}
else
{
Response.Write("類型轉(zhuǎn)換失敗");
}
三、C#中as的轉(zhuǎn)換規(guī)則
1、檢查對(duì)象類型的兼容性,并返回轉(zhuǎn)換結(jié)果,如果不兼容則返回null;
2、不會(huì)拋出異常;
3、如果結(jié)果判斷為空,則強(qiáng)制執(zhí)行類型轉(zhuǎn)換將拋出NullReferenceException異常;
4、用as來(lái)進(jìn)行類型轉(zhuǎn)換的時(shí)候,所要轉(zhuǎn)換的對(duì)象類型必須是目標(biāo)類型或者轉(zhuǎn)換目標(biāo)類型的派生類型
例如
Label lb = o as Label;
if (lb == null)
{
Response.Write("類型轉(zhuǎn)換失敗");
}
else
{
Response.Write("類型轉(zhuǎn)換成功");
}
使用as操作符有如下幾點(diǎn)限制
第一個(gè)就是,不用在類型之間進(jìn)行類型轉(zhuǎn)化,即如下編寫就會(huì)出現(xiàn)編譯錯(cuò)誤。
NewType1 newValue = newValue as NewType1;
第二個(gè)就是,不能應(yīng)用在值類型數(shù)據(jù),即不能如下寫(也會(huì)出現(xiàn)編譯錯(cuò)誤)。
int nValue = objTest as int;
四、as與is的區(qū)別
1、AS在轉(zhuǎn)換的同事兼判斷兼容性,如果無(wú)法進(jìn)行轉(zhuǎn)換,則 as 返回 null(沒(méi)有產(chǎn)生新的對(duì)象)而不是引發(fā)異常。有了AS我想以后就不要再用try-catch來(lái)做類型轉(zhuǎn)換的判斷了。因此as轉(zhuǎn)換成功要判斷是否為null。
2、AS是引用類型類型的轉(zhuǎn)換或者裝箱轉(zhuǎn)換,不能用與值類型的轉(zhuǎn)換。如果是值類型只能結(jié)合is來(lái)強(qiáng)制轉(zhuǎn)換
3、IS只是做類型兼容判斷,并不執(zhí)行真正的類型轉(zhuǎn)換。返回true或false,不會(huì)返回null,對(duì)象為null也會(huì)返回false。
4、AS模式的效率要比IS模式的高,因?yàn)榻柚鶬S進(jìn)行類型轉(zhuǎn)換的化,需要執(zhí)行兩次類型兼容檢查。而AS只需要做一次類型兼容,一次null檢查,null檢查要比類型兼容檢查快。
五、在進(jìn)行類型轉(zhuǎn)換的時(shí)候,可以按照如下的方式進(jìn)行選擇
1、Object => 已知引用類型
使用as操作符來(lái)完成
2、Object => 已知值類型
先使用is操作符來(lái)進(jìn)行判斷,再用類型強(qiáng)轉(zhuǎn)方式進(jìn)行轉(zhuǎn)換
3、已知引用類型之間轉(zhuǎn)換
首先需要相應(yīng)類型提供轉(zhuǎn)換函數(shù),再用類型強(qiáng)轉(zhuǎn)方式進(jìn)行轉(zhuǎn)換
4、已知值類型之間轉(zhuǎn)換
最好使用系統(tǒng)提供的Convert類所涉及的靜態(tài)方法
六、(int)和Int32.Parse(),Convert.ToInt32()三者的區(qū)別
1、(int)轉(zhuǎn)換:用在數(shù)值范圍大的類型轉(zhuǎn)換成數(shù)值范圍小的類型時(shí)使用,但是如果被轉(zhuǎn)換的數(shù)值大于或者小于數(shù)值范圍,則得到一個(gè)錯(cuò)誤的結(jié)果,利用這種轉(zhuǎn)換方式不能將string轉(zhuǎn)換成int,會(huì)報(bào)錯(cuò)。
2、Int32.Parse()轉(zhuǎn)換:在符合數(shù)字格式的string到int類型轉(zhuǎn)換過(guò)程中使用,并可以對(duì)錯(cuò)誤的string數(shù)字格式的拋出相應(yīng)的異常。
3、Convert.ToInt32()轉(zhuǎn)換:使用這種轉(zhuǎn)換,所提供的字符串必須是數(shù)值的有效表達(dá)方式,該數(shù)還必須不是溢出的數(shù)。否則拋出異常。
希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。
相關(guān)文章
C#實(shí)現(xiàn)在PDF文檔中應(yīng)用多種不同字體
在PDF文檔中,可繪制不同字體樣式、不同語(yǔ)言的文字,可通過(guò)使用Standard字體、TrueType字體、CJK字體或者自定義(私有)等字體類型。本文將具體介紹實(shí)現(xiàn)的方法,需要的可以參考一下2022-01-01C#讀取txt文件數(shù)據(jù)的方法實(shí)例
讀取txt文本數(shù)據(jù)的內(nèi)容,是我們開(kāi)發(fā)中經(jīng)常會(huì)遇到的一個(gè)功能,這篇文章主要給大家介紹了關(guān)于C#讀取txt文件數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2021-05-05C#實(shí)現(xiàn) Server-sent Events的步驟
這篇文章主要介紹了C#實(shí)現(xiàn) Server-sent Events的步驟,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下2021-01-01C#使用表達(dá)式樹(shù)(LambdaExpression)動(dòng)態(tài)更新類的屬性值(示例代碼)
這篇文章主要介紹了C#使用表達(dá)式樹(shù)(LambdaExpression)動(dòng)態(tài)更新類的屬性值,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01c# 自定義值類型一定不要忘了重寫Equals,否則性能和空間雙雙堪憂
這篇文章主要介紹了c# 自定義值類型一定不要忘了重寫Equals,幫助大家提高c# 程序的性能,感興趣的朋友可以了解下2020-08-08C#使用DevExpress中的SplashScreenManager控件實(shí)現(xiàn)啟動(dòng)閃屏和等待信息窗口
這篇文章介紹了C#使用DevExpress中的SplashScreenManager控件實(shí)現(xiàn)啟動(dòng)閃屏和等待信息窗口的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05