标签:
数据类型的转换在编程中随处可见,比如将一个int类型的值转换成float类型的值,或者将一个自定义类型转换成其他自定义类型等等。因此,对于使用C#的人来说了解C#中的各种类型转换方式是非常有必要的,下面就聊一聊常用到的转换方式。
一、隐式转换和显示转换(强制转换)
隐式转换和显示转换估计是大家接触的最早的类型转换方式了,记得刚学C语言时老师就讲过,由于每种类型的存储空间不同,因此在进行转换的时候难免会丢失数据或者精度...balabalabala........ C#里也是一样,一个int类型的值可以在不丢失数据的情况下隐式转换成float类型的值,而一个float类型的值可以显示转换成int类型的值,但是可能会丢失数据。
在.NET中的所有基类型之间进行隐式或显示转换并不需要我们做过多的操作,因为.NET已经替我们封装好了基类型之间进行相互转换的操作,我们只需写出相关的转换语句就行。
如: int i = 5;
float j = i;
float i = 5.0;
int j = (int)i;
那么在我们写的自定义类型之间如何进行隐式或显示转换操作呢?首先可以想到的就是继承,通过继承我们可以在子类和父类之间进行隐式、显示转换操作(这个很简单)。其次就是下面要说的implicit和explicit关键字。比如我定义类Animal和People两个类,并且两个类之间不存在继承等关系。我们就可以使用implicit和explicit关键字来定义它们之间的隐式、显示转换关系。
class Program { static void Main(string[] args) { Animal a = new People();//People可以隐式转换成Animal类型 People p = (People)new Animal();//Animal类型必须显示转换成People类型 } } public class Animal { public string Name; public int Age; //People类型可以隐式转换成Animal类型 public static implicit operator Animal(People p) { Animal animal = new Animal(); animal.Name = p.Name; animal.Age = p.Age; return animal; } } public class People { public string Name; public int Age; public bool Gender; public float Height; //Animal类型必须显示转换成People类型 public static explicit operator People(Animal animal) { People p = new People(); p.Name = animal.Name; p.Age = animal.Age; p.Gender = false; p.Height = 170; return p; } }
二、IConvertible——自定义类型向基类型之间的转换
IConvertible定义了自定义类型转换成基类型的所有操作,主要分为三个部分
具体用法如下,由于本人。。。(懒癌患者),所以只是展示了IConvertible用法,并没有具体实现转换的方法,有兴趣的可以自行根据实际需求去实现。定义了之后就可以使用 MyType mt = new MyType(); mt.ToXXX()等对应方法转换到相应的基类型。
public class MyType : IConvertible { public TypeCode GetTypeCode() { throw new NotImplementedException(); } public bool ToBoolean(IFormatProvider provider) { throw new NotImplementedException(); } public byte ToByte(IFormatProvider provider) { throw new NotImplementedException(); } public char ToChar(IFormatProvider provider) { throw new NotImplementedException(); } public DateTime ToDateTime(IFormatProvider provider) { throw new NotImplementedException(); } public decimal ToDecimal(IFormatProvider provider) { throw new NotImplementedException(); } public double ToDouble(IFormatProvider provider) { throw new NotImplementedException(); } public short ToInt16(IFormatProvider provider) { throw new NotImplementedException(); } public int ToInt32(IFormatProvider provider) { throw new NotImplementedException(); } public long ToInt64(IFormatProvider provider) { throw new NotImplementedException(); } public sbyte ToSByte(IFormatProvider provider) { throw new NotImplementedException(); } public float ToSingle(IFormatProvider provider) { throw new NotImplementedException(); } public string ToString(IFormatProvider provider) { throw new NotImplementedException(); } public object ToType(Type conversionType, IFormatProvider provider) { throw new NotImplementedException(); } public ushort ToUInt16(IFormatProvider provider) { throw new NotImplementedException(); } public uint ToUInt32(IFormatProvider provider) { throw new NotImplementedException(); } public ulong ToUInt64(IFormatProvider provider) { throw new NotImplementedException(); } }
三、Convert——基类型之间的转换
上面说到了自定义类型向基类型之间的转换,那么基类型向基类型之间转换除了隐式转换和显示转换还有没有其他的方式?比如经常用到的将一个string类型转换成int类型。由于string类型到int类型并不存在显示或隐式转换的关系,因此就需要用到下面要说的Convert类来进行转换。Contert是一个静态类,可以实现基类型之间的转换,并且这种转换是与语言无关的。上一节实现IConvertible接口的MyType中也可以用到Contert来辅助实现具体的转换方法。
class Program { static void Main(string[] args) { int i = Convert.ToInt32("15"); bool boo = Convert.ToBoolean("false"); int j = int.Parse("20"); Console.WriteLine(i); Console.WriteLine(boo); Console.ReadKey(); } }
除此之外Convert还可以通过Convert.ChangeType()方法将一个自定义的类型转换成一个或多个基类型,这种实现要求形参中待转换的类型实现IConvertible接口。
除了静态的Convert类之外也可以调用基类型的Parse和TryParse方法进行转换。
标签:
原文地址:http://www.cnblogs.com/nizhenghua/p/5732243.html