.netframerwork中的类型转换

  类型转换,就是在不同的类型之间转换数据,.netframerwork是强类型的。什么是强类型,强类型就是在定义变量的时候必须显示指定变量的类型。但是现在也有了匿名类型var。现在我们不谈var。所以这里说的framerwork还是强类型的,强类型在安全性方面是有很大好处的。因为我们只能以某种方式使用某种变量。有时候我们需要在类型之间做一写转换,比如把数值类型转换为string,或者把string转换为数值。这里就介绍一下类型的转换。

  类型的转换分位两种,隐式转换和显示转换。隐式转换是系统自动转换的。

 

  隐式转换

  那么隐式转换在什么时候会发生呢?在我们转换的时候,只要数据不会发生任何变化。隐式转换就发生了,其实就是从小类型向大类型转换。因为大类型能包含的数据字节比小类型多,所以数据可以安全的复制。

  下面的表说明了隐式类型转换

  这里有一点需要注意,当我们在处理浮点数的时候,哪怕是某些类型的数据字节较小也是能转换的,这样只是会丢失字节,失去精度。值实际上是不变的。比如从long/ulong转换成float,double转换为float.只是会失去精度,实际上允许。

  可空类型向可空类型转换,基础类型向可空类型转换也要符合上表的规则。

 

  显示转换

  显示转换其实就是强制转换,就是强制把一个类型转换成为另外一个类型。

  显示转换有可以会丢失数据,如果把字节较大的类型转换为字节较小的类型。就有可能丢失数据。这里需要注意:任何数字类型转换为char都会丢失数去,decimal转换为任何数字类型也会丢失数据,因为他们的内部结构不同。

  先来看看一些简单的转换

            double d = 30000;
            int i = (int)d;

            Console.WriteLine(i);

  这里的转换是不会失败的,因为3000没有超出int的范围,但是有时候变量并不是我们显示指定的值,有时候是通过程序计算出来的,我们也无法估计值。所以,强制转换实际上是不安全的。我们可以加上checked,checked我在运算符一文中介绍了。

            int i = checked((int)d);

  我们来看看为什么不能把整数类型转换char。

            int i = 43;
            char c = (char)i;

            Console.WriteLine(c);

  输出结果为+号,因为会把整数转换为ASCII编码的字符。但是我们可以尝试的decimal到char的转换。

  强制转换有一些限制,值类型只能在数字,char,enum类型之间转换

  boolean类型不能转换为其他类型,也不能把其他类型转换为bool类型。

 

  另外的一些转换

  我们还可以使用一些类的一些方法做转换。比如有些基础类型的某些方法。

            int result =0;
            string sInt = "12345";
            string sh = "Hello";
            string sBool = "true";

            int i = int.Parse(sInt);
            bool b= int.TryParse(sh,out result);
            int i1= Convert.ToInt32(sInt);
            bool b1 = bool.Parse(sBool);

            Console.WriteLine(i);
            Console.WriteLine(b);
            Console.WriteLine(i1);
            Console.WriteLine(b1);
            Console.WriteLine(result);

   Prase:转换成指定的基础类型,如果转换不成功,抛出异常

   TryPrase:尝试转换,返回bool指定是否转换成功,使用out返回值

  Convert.toXXX:使用一种与语言无关,针对公共语言运行库的转换,可以通过一般格式来使用。跟数据类型无关。转换不成功也会引发异常。

posted @ 2011-11-15 05:00  刘中栋  阅读(282)  评论(0编辑  收藏  举报