LzmTW
http://blog.csdn.net/lzmtw
2004-11-21
在VB.NET中,涉及类型转换的主要有两种场合:
一是基本类型的相互转换,
二是将一个表达式转换为对象、结构、类或接口。
一、基本类型的相互转换
这里有两种类型的数据转换:扩展和收缩。
扩展:转换能够维持原来的数据值,没有数据损失。
收缩:从一种较大的类型到一种较小的类型转换数据的尝试(按字节或者精度计),而小的数据类型不能维持原来的数值。
运用方法:
1、Sytem.Convert类
受支持的基类型是 Boolean、Char、SByte、Byte、Int16、Int32、Int64、UInt16、UInt32、UInt64、Single、Double、Decimal、DateTime 和 String。
2、内部类型转换函数
CBool(expression)
CByte(expression)
CChar(expression)
CDate(expression)
CDbl(expression)
CDec(expression)
CInt(expression)
CLng(expression)
CObj(expression)
CShort(expression)
CSng(expression)
CStr(expression)
3、NET的数值分析特性:Parse方法
Parse方法是NumberStyles枚举的一个成员,它生存在System.Globalization名称空间。
二、将一个表达式转换为对象、结构、类或接口
运用方法:
Ctype关键字
DirectCast关键字
两者都能返回表达式显式地转换为指定数据类型、对象、结构、类或接口后的结果。
这两个关键字都将要转换的表达式作为第一个参数,而将要转换成的类型作为第二个参数。如果未定义表达式的数据类型与第二个参数所指定的数据类型之间的转换,那么这两种转换都会失败。
注意的是:
1、只要定义了表达式与类型之间的有效转换,CType 即可成功,而 DirectCast 则要求对象变量的运行时类型与指定的类型相同。DirectCast 的特别之处具体表现在:从 Object 类型到任何其他类型的转换作为直接强制转换沿层次结构执行,而忽略 Object 中的所有特殊转换行为。当转换运行时类型为基元值类型的 Object 类型的表达式时,如果指定的类型与表达式的运行时类型不同,则 DirectCast 将引发 System.InvalidTypeException 异常。不过,如果表达式的指定类型和运行时类型相同,则 DirectCast 的运行时性能比 CType 的运行时性能好。
Dim Q As Object = 2.37 ' Requires Option Strict to be Off.
Dim I As Integer = CType(Q, Integer) ' Succeeds.
Dim J As Integer = DirectCast(Q, Integer) ' Fails.
在上例中,Q 的运行时类型为 Double。CType 因为 Double 可以转换成 Integer 而成功了,DirectCast 则因为 Q 的运行时类型不是 Integer 而失败了。
2、DirectCast只对引用类型变量进行转换,不对值类型变量进行转换
Dim Q As Integer = -1
Dim I As Boolean = CType(Q, Boolean) ' Succeeds.
Dim J As Boolean = DirectCast(Q, Boolean) ' Fails.
附:关于值类型和引用类型
如果某个数据类型在自己的内存分配中包含数据,则该数据类型是“值类型”。“引用类型”含有指向包含数据的其他内存位置的指针。
值类型包括:
- 所有数字数据类型
- Boolean、Char 和 Date
- 所有结构,即使其成员是引用类型
- 枚举,因为其基础类型总是 Byte、Short、Integer 或 Long
引用类型包括:
- String
- 所有数组,即使其元素是值类型
- 类类型,如 Form
- 委托
可以将引用类型或值类型指派给 Object 数据类型的变量。Object 变量总是持有指向数据的指针,从不持有数据本身。然而,如果将值类型指派给 Object 变量,则 Object 变量将表现得像持有自己的数据一样。
通过将某个 Object 变量传递到 Microsoft.VisualBasic 命名空间中 Information 类的 IsReference 方法,可以查看该变量充当的是引用类型还是值类型。如果 Object 变量的内容表示引用类型,则 Microsoft.VisualBasic.Information.IsReference 返回 True。