二十五:Char实例与各种数值类型相互转换的三种技术实现
2009-02-03 20:49
615 查看
以下按性能顺序列出了三种可实现方法:
(一)强制类型转换:这是最简单也是效率最高的方法,因为编译器会生成中间语言指令来执行转换,不必调用任何方法。有的语言(比如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
}
}
(一)强制类型转换:这是最简单也是效率最高的方法,因为编译器会生成中间语言指令来执行转换,不必调用任何方法。有的语言(比如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
}
}
相关文章推荐
- 使用扩展方法实现枚举类型与数值类型的相互转换
- java中int,char,string三种类型的相互转换
- CString/String/int/wchar/char类型相转 CString各种类型相互转换小结
- [转] java中int,char,string三种类型的相互转换
- java中int,char,string三种类型的相互转换
- java中int,char,string三种类型的相互转换
- 在C#中int,string等各种类型之间的相互转换--现在写点技术文档
- java中int,char,string三种类型的相互转换
- java中int,char,string三种类型的相互转换
- java中int,char,string三种类型的相互转换
- c++ CString string char* char int类型的相互转换
- Data、String、Long三种日期类型之间的相互转换
- C++数值类型与string的相互转换
- java int,string,char三种类型变量之间的互相转换
- 实例:常用数据类型之间的相互转换
- 简单的stringstream实例--实现字符串与数字之间相互转换
- 用标准c++实现string与各种类型之间的转换
- C#实现char字符数组与字符串相互转换的方法
- Cstring与char、string、int等数据类型的相互转换方法
- python各种类型转换-int,str,char,float,ord,hex,oct等