二十五:Char实例与各种数值类型相互转换的三种技术实现
以下按性能顺序列出了三种可实现方法:
(一)强制类型转换:这是最简单也是效率最高的方法,因为编译器会生成中间语言指令来执行转换,不必调用任何方法。有的语言(比如C#)允许指定在执行转换时是使用checked还是unchecked。
(二)使用Convert类型:System.Convert类型提供了几个静态方法来实现Char和数值类型之间的相互转换,这些方法都是以checked方式来执行的。所以一旦发现转换会造成数据丢失,就会抛出一个OverflowException异常。
(三)使用IConvertible接口:Char类型和FCL中的所有数值类型都实现了IConvertible接口,该类型定义了像ToUInt32和ToChar这样的方法,这种方法的效率最差,因为在值类型了调用一个接口方法,要求对实例执行装箱——Char和所有数值类型都发球值类型。假如某个类型不能转换(比如将Char转换成Boolean),或者转换将造成数据丢失,IConvertible的方法会抛出一个System.InvalidCastException异常。许多类型(包括FCL的Char和数值类型)都将IConvertible的方法实现为显式接口成员,这意味着在调用接口的任何一个方法之前,都必须将实例显式转型为一个IConvertible。IConvertible的所有方法(GetTypeCode除外)都要获取一个特殊的对象引用作为参数,该对象实现了IFormatProvider接口。执行大多数转换时,都可以将这个参数传递为null。
以下代码演示了如何运用这三种技术:
using System;
public sealed class Program
{
public static void Main()
{
Char c;
Int32 n;
//使用强制类型转换
c = (Char)65;
Console.WriteLine(c); //显示A
n = (Int32)c;
Console.WriteLine(n); //显示65
c = unchecked((Char)(65536 + 65));
Console.WriteLine(c); //显示A
//使用Convert类型实现
c = Convert.ToChar(65);
Console.WriteLine(c); //显示A
n = Convert.ToInt32(c);
Console.WriteLine(n); //显示65
//演示Convert的范围检查
try
{
c = Convert.ToChar(70000);
Console.WriteLine(c); //不执行
}
catch (OverflowException)
{
Console.WriteLine("Can't convert 70000 to Char ! ");
}
//使用IConvertible接口实现
c = ((IConvertible)65).ToChar(null);
Console.WriteLine(c); //显示A
n = ((IConvertible)c).ToInt32(null);
Console.WriteLine(n); //显示65
}
}
public sealed class Program
{
public static void Main()
{
Char c;
Int32 n;
//使用强制类型转换
c = (Char)65;
Console.WriteLine(c); //显示A
n = (Int32)c;
Console.WriteLine(n); //显示65
c = unchecked((Char)(65536 + 65));
Console.WriteLine(c); //显示A
//使用Convert类型实现
c = Convert.ToChar(65);
Console.WriteLine(c); //显示A
n = Convert.ToInt32(c);
Console.WriteLine(n); //显示65
//演示Convert的范围检查
try
{
c = Convert.ToChar(70000);
Console.WriteLine(c); //不执行
}
catch (OverflowException)
{
Console.WriteLine("Can't convert 70000 to Char ! ");
}
//使用IConvertible接口实现
c = ((IConvertible)65).ToChar(null);
Console.WriteLine(c); //显示A
n = ((IConvertible)c).ToInt32(null);
Console.WriteLine(n); //显示65
}
}