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類所涉及的靜態方法。