.NET类型转换的常用方式

第一、隐式转换

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一样,就是只限于强制类型转换和非强制类型转换。

原文地址:https://www.cnblogs.com/Brainpan/p/3140554.html