各种类型转换的定义与区别

来源:互联网 发布:淘宝有违禁词吗 编辑:程序博客网 时间:2024/06/08 13:43

由于 C# 是在编译时静态类型化的,因此变量在声明后就无法再次声明,或者无法用于存储其他类型的值,除非该类型可以转换为变量的类型。         

例如,不存在从整数到任意字符串的转换。  因此,将 i 声明为整数后,就无法将字符串“Hello”赋予它,如下面的代码中所示。

int i;i = "Hello"; // Error: "Cannot implicitly convert type 'string' to 'int'"

但有时可能需要将值复制到其他类型的变量或方法参数中。  例如,您可能有一个整数变量,您需要将该变量传递给参数类型化为 double 的方法。 或者可能需要将类变量赋给接口类型的变量。 这些类型的操作称为“类型转换”。 在 C# 中,可以执行以下几种类型的转换: 

  • 隐式转换:由于该转换是一种安全类型的转换,不会导致数据丢失,因此不需要任何特殊的语法。 例如,从较小整数类型到较大整数类型的转换以及从派生类到基类的转换都是这样的转换。 (也可以从较大整数类型(只针对文本如short x = 32767;发生了int到short的隐式转换,不能是变量(如int a=1;short x=a)此处必须强制转换)转换到较小的整数类型,只要没有任何数据丢失就行,详见http://msdn.microsoft.com/zh-cn/library/ybs77ex4.aspx)

  • 显式转换(强制转换):显式转换需要强制转换运算符。 在转换中可能丢失信息时或在出于其他原因转换可能不成功时,必须进行强制转换。典型的例子包括从数值到精度较低或范围较小的类型的转换和从基类实例到派生类的转换。 

  • 用户定义的转换:可以定义一些特殊的方法来执行用户定义的转换,从而使不具有基类–派生类关系的自定义类型之间可以显式和隐式转换。 有关更多信息,请参见转换运算符(C# 编程指南) 

  • 使用帮助程序类的转换:若要在不兼容的类型之间进行转换,例如在整数与System.DateTime 对象之间转换,或者在十六进制字符串与字节数组之间转换,则可以使用System.BitConverter 类、System.Convert 类和内置数值类型的Parse 方法,例如Int32.Parse 有关更多信息,请参见如何:将字节数组转换为 int(C# 编程指南)如何:将字符串转换为数字(C# 编程指南)如何:在十六进制字符串与数值类型之间转换(C# 编程指南)

以上内容引用自MSDN:http://msdn.microsoft.com/zh-cn/library/ms173105.aspx

个人总结: 即对于兼容(即同一种数据类型)的两种数据类型(比如:int和double):使用隐式转换以及显示转换(显示转换就是强制转换)

                对于兼容的或者不兼容(即不同的数据类型,这种转换主要针对不兼容的)的两种数据类型(比如:int 和string):使用帮助程序类进行类型的转换(比如:System.Covert.ToInt32(所要转换的对象的值))

                另外,对于类似Convert转化,一定要面上过得去,即看上去是可以转化的,比如int  a=Convert.ToInt32("abc")可以编译但是运行时会报异常,而int b=Convert.ToInt32('a')是可以转化的,具体能不能转换,还是看对应的方法的重载要求。