程序员经常碰到的一个问题便是:如何正确的对类型实现转换。
在大部分情况下,当需要对FCL提供的类型进行转换时,都应该使用FCL提供的转换方法。
注: FCL 是 Framework Class Library 的缩写,即Framework类库。
这些转型方法包括:
- 使用类型的转换运算符:隐式转换和显示转换(强制转换)。
- 使用类型内置的Parse、TryParse,或者如ToString、ToDouble和ToDateTime等方法
- 使用帮助类提供的方法: System.Convert类、System.BitConverter类
- 使用CLR支持的转型 : 实际上就是基类和子类之间的相互转换
class Program
{
static void Main(string[] args)
{
Ip ip = "192.168.0.96"; //这里其实就是字符串到类型Ip之间的一个隐式转换
Console.WriteLine(ip.ToString());
Animal animal;
Dog dog = new Dog();
animal = dog; //隐式转化,因为Dog就是Animal。
//dog = animal; //编译不通过
dog = (Dog)animal; //必须存在一个显式转换
int i = 0;
float j = 0;
j = i; // int到float(Single)存在一个隐式转换
i = (int) j; // float(Single)到int存在,而且必须存在一个显示转换
}
}
class Ip
{
IPAddress value;
public Ip(string ip)
{
value = IPAddress.Parse(ip);
}
public static implicit operator Ip(string ip)
{
Ip iptemp = new Ip(ip);
return iptemp;
}
//用户自定义的类型也可以用过重载转换运算符的方式来提供这一类转换
//这里便重载了ToString这个方法
public override string ToString()
{
return value.ToString();
}
}
/*
* 如果用户自定义的类型之间需要转换,建议从面向对象的角度进行考虑,
* 因为它们一般都含有某种关系(如继承、实现等)
*/
class Animal
{
}
class Dog : Animal
{
}
class Cat : Animal
{
}
/*
* 在进行子类向基类转型的时候支持隐式转换,但基类向子类转换时,必须是显示转换。
*/
读《改善C#程序的157个建议》笔记抄录。