类型转换的分类
学过编程的朋友都知道类型转换,并且也都清楚“隐式转换”、“显式转换”、“装箱”、“拆箱”等概念。但是,类型转换究竟有多少种?如何对其进行划分?何时应该使用何种类型转换?
本文将就这些问题进行一个简要解释。需要说明的是,本文中的几乎所有内容都来自我在讲课过程中的积累,在此强烈感谢我的学员,尤其是对我的看法提出疑问和建议的学员!另外,本文不一定对您的实际编程工作有太多帮助,不过可以让您对类型转换有一个新的理解。
1、相关概念
类型转换发生的时机 (Occasion)——当发生值的复制时,可能会发生类型转换。所谓“值的复制”,包括赋值运算和方法传参。如果被赋值的变量或方法的形式参数的类型与实际的对象类型不同,就需要进行类型转换。
下面给出两种发生类型转换的情况。
1// 例1 2
int x = 10; 3
long y = x; // 此处发生类型转换,因为x与y的类型不同。 4
5
// 例2 6
void F(long var) ...{ ... } 7
8
void G() 9
...{ 10
int i = 10; 11
F(i); // 此处发生类型转换,因为实参i与形参var的类型不同。 12
} 13
源类型 (Source Type) 和目标类型 (Destination Type) ——当发生类型转换时,被赋值的变量或方法的形参的类型称为目标类型,而实际的对象的类型称为源类型。
例如前面例1中,变量x的类型int是源类型,而变量y的类型long是目标类型;例2中,变量i的类型int是源类型,而方法F的形参var的类型long是目标类型。
2、类型转换的分类
C#中的类型转换有两种分类方法,一种是根据转换方式的不同进行划分,可以分为显式 (Explicit) 转换和隐式 (Implicit) 转换两种;另外一种是根据源类型和目标类型之间的关系进行划分,可以分为变换 (Conversion)、投射 (Cast)和装箱/拆箱 (Boxing/Unboxing)。
下面这张图描绘了各种类型转化,以及它们发生的时机。

2.1 显式转换和隐式转换
从直观上看,显式和隐式转换只是语法上面的差别。当发生类型转换时,如果在代码中明确指定了目标类型,则称为显式转换,否则则称为隐式转换。
C#通过将形如“(目标类型)”这样的语法构造放在待转换对象的前面,来表示一个显式转换。
下面的代码介绍了在C#语言中进行显式和隐式转换时的语法。
int x = 10; long y = x; // 隐式转换 x = (int) long; // 显示转换
需要注意的是,不是任意两种类型之间都能随意进行转换的。另外,无论显式转换还是隐式转换,都可能会失败。
如果显式转换失败,会在运行时抛出异常(这个异常可能是InvalidCastException,也可能是InvalidOperationException、OverflowException等具体异常);如果隐式转换失败,则会在编译时得到一个错误,指出不能进行隐式转换。
最后,隐式转换也可以用显式转换替代,但显式转换不能用隐式转换替代。换句话说,可以用显式转换的地方,用隐式转换也没什么问题;但需要显式转换的地方,就一定不能用隐式转换。
下面将从另外一种角度介绍各种不同的类型转换。
| 共2页: 1 [2] 下一页 | ||
|
|
|||
| · 51CTO主编推荐经典专题 · RAID——磁盘阵列基础 · 充电计划之热门IT认证.. · 51CTO技术自测 挑战自.. · CISSP认证成长之路 · AMD Phenom三核处理器.. · 国际文档格式标准开战 · 2007年互联网大会 |
· 我是黑客我怕谁——讲.. · ARP攻击防范与解决方案 · Solaris 10 配置管理 · Solaris基础知识入门 · RIP路由协议专栏 · MPLS路由协议专栏 · OSPF路由协议专栏 · 思科路由器产品 |
||
|
|||
| · Java基础教程 · VPN技术 · ARP攻击防范与解决方案 · SQL Server 2005全解 · SOA 面向服务架构 · SQL Server 2005全解 · Java编程开发手册 · RAID——磁盘阵列基础 |
· 三层交换技术专题 · SQL Server入门到精通 · Windows Server 2003企.. · Windows远程桌面应用 · C#技术开发指南 · VPN技术 · Solaris 10 配置管理 · C#技术开发指南 |
||
|
|||
| · ARP攻击防范与解决方案 · VPN技术 · SQL Server 2005全解 · Java基础教程 · SQL Server入门到精通 · SQL Server 2005全解 · SOA 面向服务架构 · Java编程开发手册 |
· C#技术开发指南 · 三层交换技术专题 · C#技术开发指南 · Windows远程桌面应用 · RAID——磁盘阵列基础 · Windows Server 2003企.. · 邮件服务器专题 · wimax技术与趋势 |
||
| ·DB2 Viper快速入门 ·DB2 9数据库的镜像分割与.. |
·将XML应用程序从DB2 8.x.. ·DB2 9中的pureXML:如何.. |
| ·服务器中的“傻瓜机”在.. ·盖茨也喜欢登录Youtube看.. |
· · |
| ·拯救系统管理员 ·美国选民:我为什么选布什 |
·VMware公司中文命名挑战赛 ·我们真缺乏创新吗? |
| ·J0ker的CISSP之路:复习-.. ·J0ker的CISSP之路:复习-I.. |
·9月第3周安全回顾 内网安.. ·教你几招识别和防御Web网.. |
| · NGN:下一代网络 · 网络访问中断大排查 · FTTx光纤接入 |
· 教你使用Anti ARP Sniff.. · 网络嗅探教程:使用Snif.. · 常见病毒手工清除方法大.. |
| · C++是垃圾语言?! · 2007年IT界七大抄袭事件 · Java实用开发全集 |
· 解析Ajax开发框架 走进A.. · 基于Google Maps与Ajax.. · 基于Google Maps与Ajax.. |
| · 热门 IT 培训认证官方资.. · Ubuntu 中文开源频道 · Solaris基础知识入门 |
· 费力不讨好 数据中心主.. · AMD Phenom三核处理器解.. · 51CTO主编推荐经典专题 |
| · 甲骨文Oracle 11g正式发.. · Oracle数据库开发之PL/S.. · Oracle数据库开发基础教.. |
· 存储2006,一个并购的大.. · IDC宣布浪潮蝉联存储市.. · 双机热备技术 |