第一、隐式转换
byte, short, int, long, fload, double 等,根据这个排列顺序,各种类型的值依次可以向后自动进行转换
如果需要逆转换,则需要进行强制转化。同时考虑溢出的问题。
第二、数值型转换成字符型
将数值转换成字符串,因为每一个类都有一个 void ToString() 方法。所有数值型的 void ToString() 方法都能将数据转换为数值字符串。如 123.ToSting() 就将得到字符串
"123"。
将数值型字符串转换成数值, short, int, float 等数值类型均有一个 static Parse() 函数。这个函数就是用来将字符串转换为相应数值的。以一个 float 类型的转换为例: float f = float.Parse("543.21"); 其结果 f 的值为 543.21F。
第三、Convert类
System.Convert类可以实现各个基本数据类型之间的相互转换。如:
int a=Convert.ToInt32("123");
string s=Convert.ToString(a);
int b=Convert.ChangeType("123",typeof(int));
但是Convert类只提供基本数据类型之间的转换,没有提供容器(如数组)类型以及自定义类型的相互转换。如果要实现自定义类型的与基本数据类型之间相互转换,应使自定义类型实现IConvertible接口。
第三、字符的 ASCII 码和 Unicode 码
这个还没怎么用过。保留以后用的时候再整理
下面一部分是转的
一:单个变量的类型转换:
1 非强制类型转换:
不任何说明,编译器会自动完成的转换,如 int a=0;float b=a;double c=b;
2 强制类型转换:
需要加上强制类型说明符,否则编译不通过,如double c=0.0;float b=(float)c;int a=(int)b;
3 Parse与ToString方法:
提供各种数据类型与字符串之间的相互转换。大部分数据类型不能通过对字符串的强制类型转换得到,如string s="123";int a=(int)s;这样会引发编译错误,因为string无法强制类型转换为int。但是可以通过Parse方法来做这个事情,如int a=int.Parse(s);。大部分基本的值类型都有Parse方法,但引用类型基本上都没有,不过,虽然不是所有的类型都能从字符串转换得到,但是所有的类型都能转换成字符串,因为所有的类型都有ToString方法。如int a=123;string s=a.ToString();
顺便说一下,Parse是一个比较严格的方法,只要字符串的格式有一点点不对,它就会抛出异常,比如int.Parse("123.0"),或int.Parse("123,45")都会抛出异常。解决方法:如果是"123.0"之类,先Parse成浮点数,再强制类型转换成整数,如果是"123,45",可以先用string的Spilt方法分割字符串,再对分割后的每个串分别Parse,这样会得到一个int 数组{123,45}。
另外String.Format方法提供了更丰富的把数值转化为字符串的格式。
4 Convert类
System.Convert类可以实现各个基本数据类型之间的相互转换。如:
int a=Convert.ToInt32("123");
string s=Convert.ToString(a);
int b=Convert.ChangeType("123",typeof(int));
但是Convert类只提供基本数据类型之间的转换,没有提供容器(如数组)类型以及自定义类型的相互转换。如果要实现自定义类型的与基本数据类型之间相互转换,应使自定义类型实现IConvertible接口。
5 TypeConverter
System.ComponentModel.TypeConverter类提供了各种类型转换器的基类,但是你不应该构造这个类或这个类的派生类的实例,而应该通过System.ComponentModel.TypeDescriptor的GetConverter方法来获取这个转换器,再利用这个转换器进行转换。如下面代码把字符串"red"转换成红颜色:
Color c = (Color)TypeDescriptor.GetConverter(typeof(Color)).ConvertFromString("Red");
对于自定义的类型,你可以通过继承TypeConverter类来实现转换,这是最终极的方法,可以实现任意两个类型之间的相互转换,具体实现比较复杂,这里就不说了。具体可参阅MSDN的
ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/fxref_system/html/35bffd5f-b9aa-1ccd-99fe-b0833551e562.htm
6 XmlReader类
System.Xml.XmlReader类可以把文本转换为各种基本数据类型,包括数组类型,但要先把文本做成xml格式,比较麻烦。如以下代码可以把文本转换成double数组:
XmlReader xr=XmlReader.Create("E://1.xml"); xr.MoveToContent();
double[] b=(double[])xr.ReadElementContentAs(typeof(double[]), null);
当然你要把在E盘做一个xml文件,可以这样做: 123 1.2 4.2 5.6 57.5
也就是说,在数值前后加上和就行了,当然你可以把root换成任何其它的字符串都可以。用记事本另存为,文件名后缀为xml就行了。
二 容器与容器之间的相互转换(不改变容器元素的类型)
1 构造函数
许多容器的构造函数可以传入另一个容器的数值,如new List(new int[]{1,2})把一个int数组作为参数构造了一个新的List泛型类,事实上只要实现了IEnumerable接口的容器都可以这样相互转换。
2 CopyTo,ToArray,ToList函数
只要实现了ICollection接口的容器,都可以用CopyTo方法把数据复制到一个数组中。只要实现了IEnumerable接口,都可以用ToArray,ToList方法把容器中的数据复制到一个数组或List中,
3 二维数组(或多维数组)与其它容器的转换
.Net Framework中的二维数组默认是无法与一维数组或其它容器相互转换的,但可以间接的转换,用OfType扩展方法可以把二维数组转换成IEnumerable,然后由IEnumerable的ToArray,ToList就可以转换成一维数组或List。如下面代码就把二维数组转换成一维数组:
int[,] array2= { { 1, 2 }, { 1, 2 } }; int[] array1=array2.OfType().ToArray();
其实OfType真正的用途是筛选出某些特定类型的元素,而在这里实际上选择了所有的元素。
三 容器内元素的类型转换
1 Cast
任何实现IEnumerable接口的容器都可以使用这种方法。如下面把整数数组转换成字符串数组:
int[] array1={1,2,3};
IEnumerable array2 =array1.Cast()
或 string[] array2=array1.Cast().ToArray();
但是,Cast方法只限于强制类型转换和非强制类型转换,而前面所说的Parse,Convert,TypeConverter等方法都不能用,比如你不能用Cast把字符串数组转换成整数数组。
2 Select
原则上这种方法可以完成任何转换。比如把字符串数组转换成整数数组:
string[] s= { "1", "2", "3" }; int[] i=(s.Select(x=>int.Parse(x)).ToArray()); 或 int[] i=(s.Select(x=>Convert.ToInt32(x)).ToArray());
或 int[] i=(s.Select(x=>(int)TypeDescriptor.GetConverter(typeof(int)).ConvertFrom(x))).ToArray();
在这里用到了Lambda表达式。
3 ArrayList
System.Collections.ArrayList是一个可以容纳任何类型元素的类,所以要实现元素的转换,可以先把容器的元素复制到ArrayList,再把ArrayList的元素复制到另一种类型的容器,它会自动完成类型转换。如把整数数组转换成字符串数组:
int[] array1={1,2,3};
ArrayList array2=new ArrayList(array1);
string[] array3=array2.ToArray(typeof(string));
这种方法的缺点跟Cast一样,就是只限于强制类型转换和非强制类型转换。