在程序中,進行類型轉換是常見的事,C#支持基本的強制類型轉換方法,例如:
? 1 2Object obj1 =
new
NewType();
NewType newValue = (NewType)obj1;
這樣強制轉換的時候,這個過程是不安全的,因此需要用try-catch語句進行保護,這樣一來,比較安全的代碼方式應如下所示:
? 1 2 3 4 5 6 7 8 9 10Object 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、不用在類型之間進行類型轉化,即如下編寫就會出現編譯錯誤。
? 1 2NewType newValue =
new
NewType();
NewTYpe1 newValue = newValue
as
NewTYpe1;
2、不能應用在值類型數據,即不能如下寫(也會出現編譯錯誤)
? 1 2Object obj1 = 11;
int
nValue = obj1
as
int
;
對於1.,可以用傳統的類型轉換方式完成:
? 1 2NewTypeOne 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操作符,再加上老式的類型轉換操作,就可以安全完成轉換,要完成如上操作,正確的寫法如下:
? 1 2 3 4 5Object 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失敗"
,
"提示!"
)
}
}
}
}