您的位置:首页 > 编程语言 > C#

C#中的类型转换大总结

2012-11-04 11:29 253 查看
使用C#一个最常见的问题便是各种类型间的转换。

我们知道,C#中的类型分为值类型和引用类型两大类。但是,有关它们间各自转换的细节描述在网上很少得到详细的回答。现在,我结合搜索到的部分资料整理如下:

1,问题

 
 
c#中类型转换的有两种,()转换和convert转换。

我想知道的是这两个转换的区别

还有就是()转换我用了发现好多不能转换过来,但是convert是万能转换的,

那什么时候该用()什么时候该用convert呢?

最后问下子,把int sum怎么用()转换成float类型?

请详细说明,最好有举例。

 

解答:

 
(1)这两个方法的最大不同是它们对null值的处理方法:
Convert.ToInt32(null)会返回0而不会产生任何异常,但int.Parse(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)还有一点区别就是
a. Convert.ToInt32(double value)
如果 value为两个整数中间的数字,则返回二者中的偶数;即
3.5转换为4,4.5转换为 4,

而 5.5 转换为 6。 不过4.6可以转换为5,4.4转换为4

b. int.Parse("4.5")
直接报错:"输入字符串的格式不正确".

c. (int)4.6 = 4

Int转化其他数值类型为Int时没有四舍五入,强制转换

int.Parse是转换String为int

Convert.ToInt32是转换继承自Object的对象为int的.
你得到一个object对象,你想把它转换为int,用int.Parse就不可以,要用Convert.ToInt32.

个人总结:(1)Convert.ToInt32的参数比较多,Int.Parse只能转换string类型的.

(2)Parse就是把String转换成int,char,double....等,
也就是*.Parse(string)括号中的一定要是string.

(3)Convert可以提供多种类型的转换,也就是Convert.*()括号中可以为很多种类型(包括string).
 

2,问题:

 

如何使用 as和 is运算符安全地进行强制转换?

解答:
首先,在MSDN(http://msdn.microsoft.com/zh-cn/library/cc488006.aspx)给出的解释非常简单,过于简单。

更详细的解释如下:
在程序中,进行类型转换是常见的事。那么在C#中支持以前语言的类型转换方法,
即用类型名进行强行转换,例如:
object objTest =new
NewType();
NewType newValue = (NewType)objTest;
 
但是这样转换,有个严重的问题,就是在把objTest强转换成NewType类型对象的时候,
这个过程是不安全的,因此需要用try-catch语句来进行保护。这样一来,
比较安全的代码方式应该如下所示。
   object objTest =new
NewType();
   NewType newValue =null;
   try
    {
        newValue = (NewType)objTest;
    }
   catch( Exception err )
    {
        MessageBox.Show( err.Message );
    }
 
但是如上的写法在C#中已经属于过时的写法,而且也属于比较低效的写法。
在C#中比较高效而且安全的写法,应该用as操作符,那么完成如上类似功能的正确代码应该如下。
   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"
    }
 
但是,使用as操作符有如下几点限制。
第一个就是,不用在类型之间进行类型转化,即如下编写就会出现编译错误。
NewType newValue =new
NewType();
NewType1 newValue = newValue
as NewType1;
 
第二个就是,不能应用在值类型数据,即不能如下写(也会出现编译错误)。
   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;
    }
 
除了如上两点限制外,在用as操作符来进行类型转换的时候,有个细微的问题。在前面
所说的,用as来进行类型转换的时候,所要转换的对象类型必须是目标类型或者转换目
标类型的派生类型,那么这样就有个问题,即用as操作符来进行类型转换的时候无法转
换成正确的类型,也就是说本来应该转换成子类型,却转换成了父类型。但是我并不认
为这是个严重问题,因为在用as操作符来进行类型转换的时候,如何选择目标类型在编
码的时候已经很明确了,即用父类型作为目标类型,那么类型转换的目的就是转换成父
类型对象进行操作;反之亦然。
 
在C#中已经提供了一个很好的类型转换方式,那么在进行类型转换的时候,可以按照如
下的方式进行选择。
类型转换
使用选择
Object =>已知引用类型
使用as操作符来完成
Object =>已知值类型
先使用is操作符来进行判断,再用类型强转方式进行转换
已知引用类型之间转换
首先需要相应类型提供转换函数,再用类型强转方式进行转换
已知值类型之间转换
最好使用系统提供的Convert类所涉及的静态方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: