在程序中,进行类型转换是常见的事,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();
NewTypeOne newTestTwo = (NewTypeTwo) newTestOne;
要想使上面的操作正确完成,在原有类型中增加类型转换操作符函数,即需要完成类似如下的代码:
public calss NewTypeOne
{
public static explicit operator NewTypeTwo(NewTypeOne obj)
{
//Convert Object into new type
}
}
对于2,在C#中可以使用is操作符,再加上老式的类型转换操作,就可以安全完成转换,要完成如上操作,正确的写法如下:
Object obj1 = 11;
if(objTest is int)
{
int Value = (int)obj1;
}
在C#中提供的很好的类型转换方式总结为:
1.Object => 已知引用类型——使用as操作符完成;
2.Object => 已知值类型——先使用is操作符来进行判断,再用类型强转换方式进行转换;
3.已知引用类型之间转换——首先需要相应类型提供转换函数,再用类型强转换方式进行转换;
4.已知值类型之间转换——最好使用系统提供的Convert类所涉及的静态方法。
This is the Way!