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