[毕业生的商业软件开发之路]C#数据类型转换-阿里云开发者社区

开发者社区> 安全> 正文

[毕业生的商业软件开发之路]C#数据类型转换

简介:




近期开始接触到在校学生、高校实习生和毕业生,在此说一下笔者对这些徘徊在职场门口的学生一些建议,希望能给这些初学者进入软件开发行业带来一些帮助,使得毕业生能更顺利的进入软件开发公司开始职场生涯,人生来一个完美的转弯。[袁永福版权所有]

--------------------------------------------------------------------

在程序开发中经常需要进行数据类型的转换,C#提供强制数据类型转换和使用关键字as的数据类型转换,还提供关键字is来进行数据类型的判断。

强制类型转换

强制类型转换就是将一个类型的数据无条件的强制转换为其他数据类型。具有安全的强制类型转换和不安全的强制类型转换。

对于数值类型的基础数据类型,存在以下安全的强制数据类型转换路径“boolsbytecharshortintlongfloatdouble”,从这里可以看出,这条安全的路径越靠后,取值范围就越大。比如以下代码就是一个安全的强制类型转换。

int v1 = 98;

double v2 = (double)v1;

对于安全的强制类型转换,可以将类型转换运算符省掉,比如上述第二行代码可以写成“double v2 = v1;

反过来,在这个强制类型转换路径上逆道行驶,则就是不安全的强制类型转换,比如以下代码就是不安全的强制类型转换,

double v3 = 98.34;

int v4 = (int )v3;

这个转换后,数值“98.34被转换为“98,两者不等,因此是不安全的,可能导致程序错误,而且不安全的强制转换中转换符号不能省略,比如上面的第二行代码就不能写成“int v4 = v3 ;”。

类类型之间也能进行强制类型转换,语法为“类型名称 变量名=(类型名称)变量名2,比而且要保证要转换的对象引用是转换后的类型或者派生类。

如下所示,程序中定义了以下几个类型,各个类型的继承派生关系如下。

 

 

 

这几个类型按照继承关系形成一个以“System.Object”类型为唯一根节点的树状结构,从叶子节点出发到跟节点,形成多条安全的数据类型转换路径,例如“卡车类型→汽车类型→机械类型→Object”,和“大米类型→食品类型→Object”,沿着这条路径进行类型转换是安全的,肯定能转换成功;反过来是不安全的类型转换,可能不成功。

例如以下转换过程是安全的,肯定成功

卡车类型 instance = new 卡车类型( ) ;

机械类型 instance2 = ( 机械类型 ) instance ;

以下转换过程是不安全的,可能会失败

机械类型 instance = new 卡车类型( ) ;

机械类型 instance2 = new 电钻类型( ) ;

 

汽车类型 car1 = ( 汽车类型 ) instance1 ; // 不安全的转换,能成功。

汽车类型 car2 = ( 汽车类型 ) instance2 ; // 不安全的转换,不成功,会爆运行时错误。

若在这个类型继承树上凭空跳到另外一个节点,则就是不可能的类型转换,而且会爆编译错误的,例如以下的类型转换的代码就根本行不通。

卡车类型 instance = new 卡车类型( );

食品类型 instance2 =  食品类型 ) instance ;

 

 

as类型转换

由于强制类型转换可能会发生错误,C#提供一个使用关键字as的类型转换。其语法为“要转换的类型名称 变量 要转换的变量 as 要转换的类型名称 ”,若转换成功则会设置变量值,若转换失败则设置变量值为空引用。[袁永福原创]

例如对于上节课程提到的数据类型转换路径“卡车类型→汽车类型→机械类型→Object”,则可以执行以下的代码

汽车类型 instance = new 卡车类型( );

客车类型 bus = instance  as  客车类型 ;

由于这是不安全的转换,转换失败,此时程序不会报错,但会设置变量bus为空引用。

对于以下代码

汽车类型 instance = new 卡车类型( );

卡车类型 instance2 = instance as 卡车类型;

这是安全的转换,转换成功,会设置变量instance2的变量指向某个对象实例。

使用as类型转换比强制类型转换的好处就是转换失败时不会发生错误,此时应用程序需要检查转换结果值来判断转换是否成功。[袁永福原创]

is类型判断

C#提供关键字is来进行类型判断,其用法为“变量名 is 类型名称”,这是一个表达式,返回的是布尔值,用于判断指定的对象实例可否转换为指定的类型。例如执行以下代码

机械类型 instance = new 卡车类型( );

bool result = instance is 汽车类型 ;

由于此处instance指向的是一个卡车类型,而卡车类型是汽车类型的派生类,可以转换为汽车类型,因此instance是类型汽车类型,因此result的值为true

使用关键字is的类型判断能判断对象是否是指定的类型或者派生类型,也可判断是否实现了指定的接口,而且这个过程不会报错。[袁永福原创]




     本文转自xdesigner 51CTO博客,原文链接:http://blog.51cto.com/xdesigner/624601,如需转载请自行联系原作者






版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
+ 订阅

云安全开发者的大本营

其他文章