类型转换函数 (Visual Basic)

这些函数是内联编译的,这意味着转换代码是计算表达式的代码的一部分。 有时不会调用过程来完成转换,这样可提高性能。 每个函数都会将表达式强制转换为特定数据类型。

语法

CBool(expression)
CByte(expression)
CChar(expression)
CDate(expression)
CDbl(expression)
CDec(expression)
CInt(expression)
CLng(expression)
CObj(expression)
CSByte(expression)
CShort(expression)
CSng(expression)
CStr(expression)
CUInt(expression)
CULng(expression)
CUShort(expression)

组成部分

expression
必需。 源数据类型的任何表达式。

返回值数据类型

函数名称确定它返回的值的数据类型,如下表所示。

函数名称 返回数据类型 expression 参数的范围
CBool Boolean 数据类型 任何有效的 CharString 或是数值表达式。
CByte Byte 数据类型 Byte.MinValue (0) 到 Byte.MaxValue (255)(无符号);小数部分会舍入。1

从 Visual Basic 15.8 开始,Visual Basic 通过 CByte 函数优化浮点到字节转换的性能;有关详细信息,请参阅注解部分。 有关示例,请参阅 CInt 示例部分。
CChar Char 数据类型 任何有效的 CharString 表达式;只转换 String 的第一个字符;值可以是 0 到 65535(无符号)。
CDate Date 数据类型 任何有效的日期和时间表示形式。
CDbl Double 数据类型 对于负值为 -1.79769313486231570E+308 到 -4.94065645841246544E-324;对于正值为 4.94065645841246544E-324 到 1.79769313486231570E+308。
CDec Decimal 数据类型 对于零缩放数字(即没有小数位的数字),为 +/-79,228,162,514,264,337,593,543,950,335。 对于带有 28 个小数位的数字,范围为 +/-7.9228162514264337593543950335。 可能的最小非零数字为 0.0000000000000000000000000001 (+/-1E-28)。
CInt Integer 数据类型 Int32.MinValue (-2,147,483,648) 到 Int32.MaxValue (2,147,483,647);小数部分会舍入。1

从 Visual Basic 15.8 开始,Visual Basic 通过 CInt 函数优化浮点到整数转换的性能;有关详细信息,请参阅注解部分。 有关示例,请参阅 CInt 示例部分。
CLng Long 数据类型 Int64.MinValue (-9,223,372,036,854,775,808) 到 Int64.MaxValue (9,223,372,036,854,775,807);小数部分会舍入。1

从 Visual Basic 15.8 开始,Visual Basic 通过 CLng 函数优化浮点到 64 位整数转换的性能;有关详细信息,请参阅注解部分。 有关示例,请参阅 CInt 示例部分。
CObj Object Data Type 任何有效的表达式。
CSByte SByte 数据类型 SByte.MinValue (-128) 到 SByte.MaxValue (127);小数部分会舍入。1

从 Visual Basic 15.8 开始,Visual Basic 通过 CSByte 函数优化浮点到带符号字节转换的性能;有关详细信息,请参阅注解部分。 有关示例,请参阅 CInt 示例部分。
CShort Short 数据类型 Int16.MinValue (-32,768) 到 Int16.MaxValue (32,767);小数部分会舍入。1

从 Visual Basic 15.8 开始,Visual Basic 通过 CShort 函数优化浮点到 16 位整数转换的性能;有关详细信息,请参阅注解部分。 有关示例,请参阅 CInt 示例部分。
CSng Single 数据类型 对于负值,为 -3.402823E+38 到 -1.401298E-45;对于正值,为 1.401298E-45 到 3.402823E+38。
CStr String 数据类型 CStr 的返回值取决于 expression 参数。 请参阅返回 CStr 函数的值
CUInt UInteger 数据类型 UInt32.MinValue (0) 到 UInt32.MaxValue (4,294,967,295)(无符号);小数部分会舍入。1

从 Visual Basic 15.8 开始,Visual Basic 通过 CUInt 函数优化浮点到无符号整数转换的性能;有关详细信息,请参阅注解部分。 有关示例,请参阅 CInt 示例部分。
CULng ULong 数据类型 UInt64.MinValue (0) 到 UInt64.MaxValue (18,446,744,073,709,551,615)(无符号);小数部分会舍入。1

从 Visual Basic 15.8 开始,Visual Basic 通过 CULng 函数优化浮点到无符号长整型转换的性能;有关详细信息,请参阅注解部分。 有关示例,请参阅 CInt 示例部分。
CUShort UShort 数据类型 UInt16.MinValue (0) 到 UInt16.MaxValue (65,535)(无符号);小数部分会舍入。1

从 Visual Basic 15.8 开始,Visual Basic 通过 CUShort 函数优化浮点到无符号 16 位整数转换的性能;有关详细信息,请参阅注解部分。 有关示例,请参阅 CInt 示例部分。

1 小数部分可以进行一种特殊类型的舍入,称为“四舍六入五成双”。 有关详细信息,请参阅“注解”。

注解

作为一种规则,应对 Convert 类或是单个类型结构或类优先使用 Visual Basic 类型转换函数,而不是 .NET Framework 方法(如 ToString())。 Visual Basic 函数旨在实现与 Visual Basic 代码的最佳交互,它们还会使源代码更短且更易于阅读。 此外,.NET Framework 转换方法不会始终生成与 Visual Basic 函数相同的结果,例如在将 Boolean 转换为 Integer 时。 有关详细信息,请参阅数据类型疑难解答

从 Visual Basic 15.8 开始,在将以下方法返回的 SingleDouble 值传递到一个整数转换函数(CByteCShortCIntCLngCSByteCUShortCUIntCULng)时,会优化浮点到整数转换的性能:

此优化使进行大量整数转换的代码的运行速度可以达到最多两倍。 下面的示例阐释了这些经过优化的浮点到整数转换:

Dim s As Single = 173.7619
Dim d As Double = s

Dim i1 As Integer = CInt(Fix(s))               ' Result: 173
Dim b1 As Byte = CByte(Int(d))                 ' Result: 173
Dim s1 AS Short = CShort(Math.Truncate(s))     ' Result: 173
Dim i2 As Integer = CInt(Math.Ceiling(d))      ' Result: 174
Dim i3 As Integer = CInt(Math.Round(s))        ' Result: 174

行为

  • 强制转换。 一般而言,可以使用数据类型转换函数将运算的结果强制转换为特定数据类型,而不是默认数据类型。 例如,在通常会进行单精度、双精度或整数算术运算的情况下使用 CDec 强制进行十进制算术运算。

  • 失败的转换。 如果传递给函数的 expression 超出了它要转换为的数据类型的范围,则会发生 OverflowException

  • 小数部分。 将非整数值转换为整型类型时,整数转换函数(CByteCIntCLngCSByteCShortCUIntCULngCUShort)会移除小数部分,并将值舍入到最接近的整数。

    如果小数部分恰好为 0.5,则整数转换函数会将它舍入到最接近的偶数。 例如,0.5 舍入到 0,1.5 和 2.5 都舍入到2。 这有时称为“四舍六入五成双”,其目的是为了补偿在将许多多这类数字加在一起时可能累积的偏差。

    CIntCLngIntFix 函数不同,后两个函数会截断(而不是舍入)数字的小数部分。 此外,FixInt 始终返回与传入时相同的数据类型的值。

  • 日期/时间转换。 使用 IsDate 函数可确定值是否可以转换为日期和时间。 CDate 可识别日期文本和时间文本,但无法识别数值。 若要将 Visual Basic 6.0 Date 值转换为 Visual Basic 2005 或更高版本中的 Date 值,可以使用 DateTime.FromOADate 方法。

  • 中性日期/时间值。 日期数据类型始终包含日期和时间信息。 为了进行类型转换,Visual Basic 将 1/1/0001(1 年 1 月 1 日)视为日期的中性值,将 00:00:00(午夜)视为时间的中性值。 如果将 Date 值转换为字符串,则 CStr 不会在结果字符串中包含中性值。 例如,如果将 #January 1, 0001 9:30:00# 转换为字符串,则结果为“上午 9:30:00”;日期信息被取消。 但是,日期信息仍然存在于原始 Date 值中,并且可以使用 DatePart 等函数进行恢复。

  • 区分区域性。 涉及字符串的类型转换函数会基于应用程序的当前区域性设置执行转换。 例如,CDate 根据系统的区域设置识别日期格式。 必须按正确的区域设置顺序提供日、月和年,否则可能无法正确解释日期。 如果长日期格式包含星期几字符串(如“Wednesday”),则无法识别该格式。

    如果需要以区域设置指定格式之外的其他格式与值的字符串表示形式进行相互转换,则不能使用 Visual Basic 类型转换函数。 为此,请使用该值类型的 ToString(IFormatProvider)Parse(String, IFormatProvider) 方法。 例如,在将字符串转换为 Double 时使用 Double.Parse,在将 Double 类型的值转换为字符串时使用 Double.ToString

CType Function

CType 函数采用第二个参数 typename,并将expression 强制转换为 typename,其中 typename 可以是存在有效转换的任何数据类型、结构、类或接口。

有关 CType 与其他类型转换关键字的比较,请参阅 CTypeTryCast 运算符

CBool 示例

下面的示例使用 CBool 函数将表达式转换为 Boolean 值。 如果表达式计算结果为非零值,则 CBool 返回 True;否则返回 False

Dim a, b, c As Integer
Dim check As Boolean
a = 5
b = 5
' The following line of code sets check to True.
check = CBool(a = b)
c = 0
' The following line of code sets check to False.
check = CBool(c)

CByte 示例

下面的示例使用 CByte 函数将表达式转换为 Byte

Dim aDouble As Double
Dim aByte As Byte
aDouble = 125.5678
' The following line of code sets aByte to 126.
aByte = CByte(aDouble)

CChar 示例

下面的示例使用 CChar 函数将 String 表达式的第一个字符转换为 Char 类型。

Dim aString As String
Dim aChar As Char
' CChar converts only the first character of the string.
aString = "BCD"
' The following line of code sets aChar to "B".
aChar = CChar(aString)

CChar 的输入参数必须属于数据类型 CharString。 无法使用 CChar 将数字转换为字符,因为 CChar 无法接受数值数据类型。 下面的示例获取一个表示码位(字符代码)的数字并将它转换为对应的字符。 它使用 InputBox 函数获取数字字符串,使用 CInt 将字符串转换为类型 Integer,并使用 ChrW 将数字转换为类型 Char

Dim someDigits As String
Dim codePoint As Integer
Dim thisChar As Char
someDigits = InputBox("Enter code point of character:")
codePoint = CInt(someDigits)
' The following line of code sets thisChar to the Char value of codePoint.
thisChar = ChrW(codePoint)

CDate 示例

下面的示例使用 CDate 函数将字符串转换为 Date 值。 一般而言,不建议将日期和时间硬编码为字符串(如本示例中所示)。 请改为使用日期和时间文本,例如 #Feb 12、1969# 和 #4:45:23 PM#。

Dim aDateString, aTimeString As String
Dim aDate, aTime As Date
aDateString = "February 12, 1969"
aTimeString = "4:35:47 PM"
' The following line of code sets aDate to a Date value.
aDate = CDate(aDateString)
' The following line of code sets aTime to Date value.
aTime = CDate(aTimeString)

CDbl 示例

Dim aDec As Decimal
Dim aDbl As Double
' The following line of code uses the literal type character D to make aDec a Decimal.
aDec = 234.456784D
' The following line of code sets aDbl to 1.9225456288E+1.
aDbl = CDbl(aDec * 8.2D * 0.01D)

CDec 示例

下面的示例使用 CDec 函数将数值转换为 Decimal

Dim aDouble As Double
Dim aDecimal As Decimal
aDouble = 10000000.0587
' The following line of code sets aDecimal to 10000000.0587.
aDecimal = CDec(aDouble)

CInt 示例

下面的示例使用 CInt 函数将值转换为 Integer

Dim aDbl As Double
Dim anInt As Integer
aDbl = 2345.5678
' The following line of code sets anInt to 2346.
anInt = CInt(aDbl)

CLng 示例

下面的示例使用 CLng 函数将值转换为 Long

Dim aDbl1, aDbl2 As Double
Dim aLng1, aLng2 As Long
aDbl1 = 25427.45
aDbl2 = 25427.55
' The following line of code sets aLng1 to 25427.
aLng1 = CLng(aDbl1)
' The following line of code sets aLng2 to 25428.
aLng2 = CLng(aDbl2)

CObj 示例

下面的示例使用 CObj 函数将数值转换为 ObjectObject 变量本身仅包含一个四字节指针,该指针指向分配给它的 Double 值。

Dim aDouble As Double
Dim anObject As Object
aDouble = 2.7182818284
' The following line of code sets anObject to a pointer to aDouble.
anObject = CObj(aDouble)

CSByte 示例

下面的示例使用 CSByte 函数将数值转换为 SByte

Dim aDouble As Double
Dim anSByte As SByte
aDouble = 39.501
' The following line of code sets anSByte to 40.
anSByte = CSByte(aDouble)

CShort 示例

下面的示例使用 CShort 函数将数值转换为 Short

Dim aByte As Byte
Dim aShort As Short
aByte = 100
' The following line of code sets aShort to 100.
aShort = CShort(aByte)

CSng 示例

下面的示例使用 CSng 函数将值转换为 Single

Dim aDouble1, aDouble2 As Double
Dim aSingle1, aSingle2 As Single
aDouble1 = 75.3421105
aDouble2 = 75.3421567
' The following line of code sets aSingle1 to 75.34211.
aSingle1 = CSng(aDouble1)
' The following line of code sets aSingle2 to 75.34216.
aSingle2 = CSng(aDouble2)

CStr 示例

下面的示例使用 CStr 函数将数值转换为 String

Dim aDouble As Double
Dim aString As String
aDouble = 437.324
' The following line of code sets aString to "437.324".
aString = CStr(aDouble)

下面的示例使用 CStr 函数将 Date 值转换为 String 值。

Dim aDate As Date
Dim aString As String
' The following line of code generates a COMPILER ERROR because of invalid format.
' aDate = #February 12, 1969 00:00:00#
' Date literals must be in the format #m/d/yyyy# or they are invalid.
' The following line of code sets the time component of aDate to midnight.
aDate = #2/12/1969#
' The following conversion suppresses the neutral time value of 00:00:00.
' The following line of code sets aString to "2/12/1969".
aString = CStr(aDate)
' The following line of code sets the time component of aDate to one second past midnight.
aDate = #2/12/1969 12:00:01 AM#
' The time component becomes part of the converted value.
' The following line of code sets aString to "2/12/1969 12:00:01 AM".
aString = CStr(aDate)

CStr 始终以当前区域设置的标准短格式呈现 Date 值,例如“6/15/2003 4:35:47 PM”。 但是,CStr 禁止显示日期的中性值 1/1/0001 和时间的中性值 00:00:00。

有关 CStr 返回的值的更多详细信息,请参阅返回 CStr 函数的值

CUInt 示例

下面的示例使用 CUInt 函数将数值转换为 UInteger

Dim aDouble As Double
Dim aUInteger As UInteger
aDouble = 39.501
' The following line of code sets aUInteger to 40.
aUInteger = CUInt(aDouble)

CULng 示例

下面的示例使用 CULng 函数将数值转换为 ULong

Dim aDouble As Double
Dim aULong As ULong
aDouble = 39.501
' The following line of code sets aULong to 40.
aULong = CULng(aDouble)

CUShort 示例

下面的示例使用 CUShort 函数将数值转换为 UShort

Dim aDouble As Double
Dim aUShort As UShort
aDouble = 39.501
' The following line of code sets aUShort to 40.
aUShort = CUShort(aDouble)

另请参阅