C#中AS和IS症結字的用法。本站提示廣大學習愛好者:(C#中AS和IS症結字的用法)文章只能為提供參考,不一定能成為您想要的結果。以下是C#中AS和IS症結字的用法正文
在法式中,停止類型轉換是罕見的事,C#支撐根本的強迫類型轉換辦法,例如:
Object obj1 = new NewType(); NewType newValue = (NewType)obj1;
如許強迫轉換的時刻,這個進程是不平安的,是以須要用try-catch語句停止掩護,如許一來,比擬平安的代碼方法應以下所示:
Object obj1 = new NewType(); NewType newValue = null; try { newValue = (NewType)obj1; } catch (Exception err) { MessageBox.Show(err.Message); }
然則下面的寫法在C#中已經是過時的寫法,也是比擬低效的寫法,比擬高效且時髦的寫法是用as操作符,以下:
Object obj1 = new NewType(); NewTYpe newValue = obj1 as NewType
平安性:
as操作符不會做過的轉換操作,當須要轉化對象的類型屬於轉換目的類型或許轉換目的類型的派生類型時,那末此轉換操作能力勝利,並且其實不發生新的對象【當不勝利的時刻,會前往null】。是以用as停止類型轉換是平安的。
效力:
當用as操作符停止類型轉換的時刻,起首斷定以後對象的類型,當類型知足請求後才停止轉換,而傳統的類型轉換方法,是用以後對象直接去轉換,並且為了掩護轉換勝利,要加上try-catch,所以,絕對來講,as效力高點。
須要留意的是,不論是傳統的照樣as操作符停止類型轉換以後,在應用之前,須要停止斷定轉換能否勝利,以下:
if(newValue != null) { //Work with the object named “newValue“ }
然則,應用as操作符要留意以下幾點:
1、不消在類型之間停止類型轉化,即以下編寫就會湧現編譯毛病。
NewType newValue = new NewType(); NewTYpe1 newValue = newValue as NewTYpe1;
2、不克不及運用在值類型數據,即不克不及以下寫(也會湧現編譯毛病)
Object obj1 = 11; int nValue = obj1 as int;
關於1.,可以用傳統的類型轉換方法完成:
NewTypeOne newTestOne = new NewTypeOne(); NewTypeTwo newTestTwo = (NewTypeTwo)newTestOne;
要想使下面的操作准確完成,在原有類型中增長類型轉換操作符函數,即須要完成相似以下的代碼:
public calss NewTypeOne { public static explicit operator NewTypeTwo( NewTypeOne obj1) { //Convert object into new type } }
關於2,在C#中可使用is操作符,再加上老式的類型轉換操作,便可以平安完成轉換,要完成如上操作,准確的寫法以下:
Object obj1 = 11; if(objTest is int ) { int nValue = (int)obj1; }
在C#中供給的很好的類型轉換方法總結為:
Object => 已知援用類型——應用as操作符完成;
Object => 已知值類型——先應用is操作符來停止斷定,再用類型強轉換方法停止轉換;
已知援用類型之間轉換——起首須要響應類型供給轉換函數,再用類型強轉換方法停止轉換;
已知值類型之間轉換——最好應用體系供給的Conver類所觸及的靜態辦法。
上面給年夜家引見下C#中關於as症結字的應用
我們在現實編碼中有時會用到as症結字來將對象轉換為指定類型,與is類型分歧的是,is症結字是用於檢討對象能否與給定類型兼容,假如兼容就前往true,假如不兼容就前往false。而as症結字會直接停止類型轉換,假如轉換勝利會前往轉換後的對象,假如轉換不勝利則不會拋出異常而是前往null。
上面我們創立一個簡略的用例來論述as的用法:
1.以visual studio2015為開辟情況,新建一個window Form窗體運用法式,並將其定名為TransForm.
2.向窗體中添加一個button控件,用於類型轉換,再添加一個GroupBox控件,向此控件中添加三個RadioButton控件,分離用於選擇哪一種類型。
3.具體代碼以下:
private void btn_Get_Checked(object sender,EventArgs e) { if(rbtn_object.checked) { using (FileStream P_filestream=new FileStream(@'d:\log.txt',System.IO.FileMode.Create)) { object p_Object = P_filestream as object; if(p_Object!=null) { Message.Box("轉換Obejct勝利","提醒"); } else { Message.Box("轉換Obejct掉敗","提醒!") } } if(rbtn_stream.checked) { using (FileStream P_filestream=new FileStream(@'d:\log.txt',System.IO.FileMode.Create)) { obejct p_object=P_filestream; Stream P_Stream = p_objec as Stream; if(P_Stream!=null) { Message.Box("轉換Stream勝利","提醒"); } else { Message.Box("轉換Stream掉敗","提醒!") } } } }