二十五: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
    }
}


 

 

 

 

posted @ 2009-02-03 20:49  Done  阅读(516)  评论(0编辑  收藏  举报