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


 

 

 

 

你可能感兴趣的:(char)