C#中的类型转换大总结
使用C#一个最常见的问题便是各种类型间的转换。
我们知道,C#中的类型分为值类型和引用类型两大类。但是,有关它们间各自转换的细节描述在网上很少得到详细的回答。现在,我结合搜索到的部分资料整理如下:
1,问题
c#中类型转换的有两种,()转换和convert转换。 我想知道的是这两个转换的区别 还有就是()转换我用了发现好多不能转换过来,但是convert是万能转换的,那什么时候该用()什么时候该用convert呢? 最后问下子,把int sum 怎么用()转换成float类型? 请详细说明,最好有举例。 |
解答:
(1)这两个方法的最大不同是它们对null值的处理方法: 没 搞清楚Convert.ToInt32和int.Parse()的细细微区别时千万别乱用,否则可能会产生无法预料的结果,举例来说:假如从url中取一 个参数page的值,我们知道这个值是一个int,所以即可以用 Convert.ToInt32(Request.QueryString["page"]),也可以 用,int.Parse(Request.QueryString["page"]),但是如果page这个参数在url中不存在,那么前者将返回0,0 可能是一个有效的值,所以你不知道url中原来根本就没有这个参数而继续进行下一下的处理,这就可能产生意想不到的效果,而用后一种办法的话没有page 这个参数会抛出异常,我们可以捕获异常然后再做相应的处理,比如提示用户缺少参数,而不是把参数值当做0来处理。 (2)还有一点区别就是 c. int(4.6) = 4 int.Parse是转换String为int 个人总结: |
2,问题:
如何使用 as 和 is 运算符安全地进行强制转换? |
解答:
首先,在MSDN(http://msdn.microsoft.com/zh-cn/library/cc488006.aspx)给出的解释非常简单,过于简单。
更详细的解释如下:
在程序中,进行类型转换是常见的事。那么在C#中支持以前语言的类型转换方法,即用类型名进行强行转换,例如:
objectbjTest =newNewType();
NewType newValue = (NewType)objTest;
但是这样转换,有个严重的问题,就是在把objTest强转换成NewType类型对象的时候,这个过程是不安全的,因此需要用try-catch语句来进行保护。这样一来,比较安全的代码方式应该如下所示。
objectbjTest =newNewType();
NewType newValue =null;
try
{
newValue = (NewType)objTest;
}
catch( Exception err )
{
MessageBox.Show( err.Message );
}
但是如上的写法在C#中已经属于过时的写法,而且也属于比较低效的写法。在C#中比较高效而且安全的写法,应该用as操作符,那么完成如上类似功能的正确代码应该如下。
objectbjTest =newNewType();
NewType newValue = objTestasNewType;
那么很明显,如上的写法首先看起来很简便,至少代码数量和强转方式一样。至于安全性,对于as操作符来说,它不会做过的转换操作,当需要转换对象的类型属于转换目标类型或者转换目标类型的派生类型的时候,那么此转换操作才能成功,而且并不产生新的对象。因此用as来进行类型转换使安全的。为什么用as操作符进行类型转换的效率要高于老式的类型转换的,因为用as操作符进行转换就如前面所说的,首先判断当前对象的类型,当类型满足要求后才进行转换。而传统的类型转换方式,是用当前对象直接去转换,而且为了保护转换成功,要加上try-catch,这就决定了它的效率不会高于as操作符的效率。
要注意的时候,不管用传统方式,还是用as操作符进行类型转换之后,在使用之前,需要进行判断转换是否成功,如下:
if( newValue!=null)
{
//Work with the object named "newValue"
}
但是,使用as操作符有如下几点限制。
第一个就是,不用在类型之间进行类型转化,即如下编写就会出现编译错误。
NewType newValue =newNewType();
NewType1 newValue = newValueasNewType1;
第二个就是,不能应用在值类型数据,即不能如下写(也会出现编译错误)。
objectbjTest = 11;
intnValue = objTestasint;
对于第一点所提的,可以用传统的类型转换方式来完成,但是光用如下的方式,是不能正确完成。
NewTypeOne newTestOne =newNewTypeOne();
NewTypeTwo newTestTwo = (NewTypeTwo)newTestOne;
但是光如上写是不能完成的,要想使如上的操作能正确完成,在原有类型中增加类型转换操作符函数,即需要完成类似如下的代码。
publicclassNewTypeOne
{
publicstatic explicitoperatorNewTypeTwo( NewTypeOne objTest )
{
//Convert object into new type
}
}
对于第二点所提的,在C#中可以使用is操作符,再加上老式的类型转换操作,就可以安全完成转换,那么要完成如上操作,正确的写法如下。
objectbjTest = 11;
if( objTestisint)
{
intnValue = (int)objTest;
}
除了如上两点限制外,在用as操作符来进行类型转换的时候,有个细微的问题。在前面所说的,用as来进行类型转换的时候,所要转换的对象类型必须是目标类型或者转换目标类型的派生类型,那么这样就有个问题,即用as操作符来进行类型转换的时候无法转换成正确的类型,也就是说本来应该转换成子类型,却转换成了父类型。但是我并不认为这是个严重问题,因为在用as操作符来进行类型转换的时候,如何选择目标类型在编码的时候已经很明确了,即用父类型作为目标类型,那么类型转换的目的就是转换成父类型对象进行操作;反之亦然。
在C#中已经提供了一个很好的类型转换方式,那么在进行类型转换的时候,可以按照如下的方式进行选择。
类型转换 |
使用选择 |
Object =>已知引用类型 |
使用as操作符来完成 |
Object =>已知值类型 |
先使用is操作符来进行判断,再用类型强转方式进行转换 |
已知引用类型之间转换 |
首先需要相应类型提供转换函数,再用类型强转方式进行转换 |
已知值类型之间转换 |
最好使用系统提供的Convert类所涉及的静态方法 |
转载于:https://www.cnblogs.com/Areas/archive/2011/09/27/2193228.html
C#中的类型转换大总结相关推荐
- 理解C#语言中的类型转换----初学者的理解,请大神指教
一下都是在视频教学中学到后的理解,如果说错了请大神指教 C#语言中的类型转换,就是将某个数据要转换成另一个类型的数据. c#语言中的数据类型主要有: char类型(字符类型): string类型(字符 ...
- C#.NET 中的类型转换
前些天,碰到了数据类型转换与格式化问题,在网上查找了一下,有人已经把它写了出来,粘贴如下,共大家分享: C#.NET 中的类型转换 C# 出来也有些日子了,最近由于编程的需要,对 C# 的类型转换做了 ...
- C语言类型转换大学霸IT达人
C语言类型转换大学霸IT达人 C语言中存在多种类型的数据,在数据运算过程中难免遇到两种不同类型在一个表达式中运算的情况.遇到这种情况C语言通过类型转换的机制,首先将操作数转换为同一类型然后进行计算.在 ...
- Javascript中的陷阱大集合【译】
参考:http://www.2cto.com/kf/201111/111203.html 昨天晚上在自己的个人技术博客上翻译了一篇有关Javascript的文章,今天想想还是把它投稿到博客园吧,大家可 ...
- typecast java_Java中的类型转换
类型转换Typecasting是一个用与Java类似的所有语言引入的术语. 当我们将原始数据类型分配给另一个数据类型时. 在Java中,类型转换具有两种类型:扩大类型转换 缩小类型转换 我们将通过示例 ...
- java中的类型转换
今天复习了一下java的基础,重新回顾一下java中的类型转换. 一.自动类型转换 java中的数值类型都能进行自动类型的转换,表示范围小的能自动转化为表示范围大的. 总的来说如下图: 还有一种自动转 ...
- 深入了解Java开发过程中的类型转换
Java开发过程中有一个特性需要我们注意,整型.实型(常量).字符型数据可以进行混合运算. 所以,在运算过程中,不同类型的数据会先转化为同一类型,然后进行运算. 深入了解Java开发过程中的类型转换 ...
- c语言int 转bool_深入理解C语言中的类型转换
今日份知识更新,即<深入理解C语言中的类型转换> 文章目录: 一.隐式转换 1.1.基本类型转换 整形提升 算数转换 1.2.指针转换 二.显式转换 隐式转换 基本类型转换 整形提升 表达 ...
- 大龙嘚吧嘚之“C#中的类型转换”(前面是铺垫,可以直接跳到最后)
首先,谷歌之: 谷歌答案一:http://blog.itpub.net/14466241/viewspace-700102/ 使用C#一个最常见的问题便是各种类型间的转换. 我们知道,C#中的类型分为 ...
最新文章
- 懒加载 字典转模型 自定义cell
- python操作mysql数据库依赖包_python安装mysql的依赖包mysql-python操作
- 运行从别处复制过来的linux可执行程序
- 苹果手机各种型号图片_2020年12月小米/红米手机推荐|小米/红米手机选购要点|小米/红米手机性价比推荐,干货满满...
- hashset去重原理_基于simhash的文本去重原理
- MySQL Cluster 群集安装环境介绍
- php如何设计自定义模型,php – Kohana ORM模型中的自定义方法
- linux监控任务跑满,Linux服务器带宽和CPU跑满或跑高排查
- 合成迪丽热巴下海_热巴生图颜值回春,被韩媒吹上天,她是找了杨幂的医生?...
- python epoll 写数据到数据库_Python--day40(EPOLL的使用、数据库基础)
- GIT学习笔记——1.2 起步 - Git 简史
- INSTALL_FAILED_UID_CHANGED解决办法
- AutoCAD2014 无法通过快捷方式启动
- MySQL的auto_increment使用
- python创建数字列表_Python 生成一个从0到n个数字的列表4种方法小结
- matlab画图中颜色渐变
- 2021-05-28 aps助油田服务与设备行业实现数字化
- 3.5Bootstrap组件篇之导航条
- Latex表格固定列宽并设置靠左、居中或靠右
- Python Z3约束求解器解决数独问题