C#中的类型转换

来源:互联网 发布:淘宝发布站点什么意思 编辑:程序博客网 时间:2024/05/07 03:02
 
1. 强制转换
E.g.:
(int)table1.rows["id"][0];这种转换在编程中不建议使用,是一种装箱拆箱的过程,就是说被转换类型本身必须是将要转换成的那种类型,否则必然出错;
E.g.:
object objTest = new NewType();
NewType newValue = (NewType)objTest;
2.      Convert
该类基本支持所以类型之间的转换。但也要求转换类型本身必须是将要转换成的那种类型,否则也会出错;
 E.g.:
Convert.toInt32(table1.rows["id"][0]);
3.      DataType.Parse()
Note:上述3种方法是不安全的,需要用try-catch语句来进行保护。
4.      DataType.TryParse(),如果转换不成功,会直接给目标变量赋初值。
 E.g.:
decimal p1;
decimal.TryParse("{}", out p1);
5.      As
E.g.:
object objTest = new NewType();
    NewType newValue = objTest as NewType;
对于as操作符来说,它不会做过的转换操作,当需要转换对象的类型属于转换目标类型或者转换目标类型的派生类型的时候,那么此转换操作才能成功,而且并不产生新的对象。因此用as来进行类型转换使安全的。为什么用as操作符进行类型转换的效率要高于老式的类型转换的,因为用as操作符进行转换就如前面所说的,首先判断当前对象的类型,当类型满足要求后才进行转换。而传统的类型转换方式,是用当前对象直接去转换,而且为了保护转换成功,要加上try-catch,这就决定了它的效率不会高于as操作符的效率。
要注意的时候,不管用传统方式,还是用as操作符进行类型转换之后,在使用之前,需要进行判断转换是否成功,如下:
    if( newValue!= null )
    {
        //Work with the object named "newValue"
    }
Note:使用as操作符有如下几点限制。
(1)不用在类型之间进行类型转化,即如下编写就会出现编译错误。
NewType newValue = new NewType();
NewType1 newValue = newValue as NewType1;
(2)不能应用在值类型数据,即不能如下写(也会出现编译错误)。
    object objTest = 11;
    int nValue = objTest as int;
对于第一点所提的,可以用传统的类型转换方式来完成,但是光用如下的方式,是不能正确完成。
    NewTypeOne newTestOne = new NewTypeOne();
    NewTypeTwo newTestTwo = (NewTypeTwo)newTestOne;
但是光如上写是不能完成的,要想使如上的操作能正确完成,在原有类型中增加类型转换操作符函数,即需要完成类似如下的代码。
    public class NewTypeOne
    {
        public static explicit operator NewTypeTwo( NewTypeOne objTest )
        {
            //Convert object into new type
        }
    }
对于第二点所提的,在C#中可以使用is操作符,再加上老式的类型转换操作,就可以安全完成转换,那么要完成如上操作,正确的写法如下。
    object objTest = 11;
    if( objTest is int )
    {
        int nValue = (int)objTest;
    }