类型转换函数 (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 数据类型 | 任何有效的 Char 或 String 或是数值表达式。 |
CByte |
Byte 数据类型 | Byte.MinValue (0) 到 Byte.MaxValue (255)(无符号);小数部分会舍入。1 从 Visual Basic 15.8 开始,Visual Basic 通过 CByte 函数优化浮点到字节转换的性能;有关详细信息,请参阅注解部分。 有关示例,请参阅 CInt 示例部分。 |
CChar |
Char 数据类型 | 任何有效的 Char 或 String 表达式;只转换 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 开始,在将以下方法返回的 Single 或 Double 值传递到一个整数转换函数(CByte
CShort
、CInt
、CLng
、CSByte
、CUShort
、CUInt
、CULng
)时,会优化浮点到整数转换的性能:
- Conversion.Fix(Double)
- Conversion.Fix(Object)
- Conversion.Fix(Single)
- Conversion.Int(Double)
- Conversion.Int(Object)
- Conversion.Int(Single)
- Math.Ceiling(Double)
- Math.Floor(Double)
- Math.Round(Double)
- Math.Truncate(Double)
此优化使进行大量整数转换的代码的运行速度可以达到最多两倍。 下面的示例阐释了这些经过优化的浮点到整数转换:
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。小数部分。 将非整数值转换为整型类型时,整数转换函数(
CByte
、CInt
、CLng
、CSByte
、CShort
、CUInt
、CULng
和CUShort
)会移除小数部分,并将值舍入到最接近的整数。如果小数部分恰好为 0.5,则整数转换函数会将它舍入到最接近的偶数。 例如,0.5 舍入到 0,1.5 和 2.5 都舍入到2。 这有时称为“四舍六入五成双”,其目的是为了补偿在将许多多这类数字加在一起时可能累积的偏差。
CInt
和CLng
与 Int 和 Fix 函数不同,后两个函数会截断(而不是舍入)数字的小数部分。 此外,Fix
和Int
始终返回与传入时相同的数据类型的值。日期/时间转换。 使用 IsDate 函数可确定值是否可以转换为日期和时间。
CDate
可识别日期文本和时间文本,但无法识别数值。 若要将 Visual Basic 6.0Date
值转换为 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
与其他类型转换关键字的比较,请参阅 CType
和 TryCast 运算符。
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
的输入参数必须属于数据类型 Char
或 String
。 无法使用 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
函数将数值转换为 Object
。 Object
变量本身仅包含一个四字节指针,该指针指向分配给它的 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)