一、数值类型
1、unsigned 和 signed 数值类型
sign 指的是 +/- 正负符号,unsigned 数值类型即无正负符号的数值类型,也就是正值数值类型;signed 数值类型即带正负符号的数值类型,可能是正值也可能是负值,但其绝对值范围约为对应 unsigned 数值类型的一半。
如:SByte(signed Byte) 取值范围为 -128 到 127,而Byte取值范围为0到255。
Short取值范围为 -32768 到 32767,而UShort(unsignedShort)取值范围为0到65535。
Integer取值范围为-2147483648到2147483647,而UInteger(unsigned Integer) 取值范围为0到
4294967295。
Long取值范围为-9223372036854775808 到 9223372036854775808,而ULong(unsigned Integer) 取值范围为0到18446744073709551615。
2、非整数 数值类型 非整数类型包括Decimal(128位,16字节)定点数、Single(32位,4字节)单精度浮点数和Double(64位,8字节)双精度浮点数。浮点数也就是实数。定点数取值不允许有舍入的误差,而浮点数允许有舍入的误差。
3、System 命名空间还提供了以位为标志的整型数值类型:Int16、Int32、Int64、UInt16、UInt32、UInt64。在VB6中,一个Long类型数值占用32位(4字节),而在Visual Basic .NET 中一个Integer类型数值就占用32位,Long类型数值占用64位(8字节)。Byte 8位,1个字节;Short 16位,2个字节。计算机处理4字节数值更高效一些,所以我们一般常声明整数用Integer,声明小数用Single。
4、数值变量类型符
附加在变量名称后面,等于 As + 相应的类型名。如: Dim zhengshu% (= Dim zhengshu As Integer)
%-- Integer,!-- Single,#-- Double,&-- Long,@-- Decimal
5、文字式数值类型符
附加在数字赋值后面。如:j = 12S(= Dim j As Short : j = 12)
S-- Short,US -- UShort,I -- Integer,UI -- UInteger,L -- Long,UL -- ULong,D -- Decimal,F-- Single(F=floating point),R-- Double(R=real)。
另外在数字前加 &O 表示8进制数值,在数字前加 &H 表示16进制数值。可以用 Hex(数值)返回相应16进制表达字符,用 Oct(数值)返回相应8进制表达字符。
二、字符类型 字符数据类型,用以处理可打印和显示的字符。字符数据类型包括Char类型和String类型,它们不能和数字类型数据直接进行转换。 1、Char类型 Char类型(也称为单个字符数据类型,也就是说这种变量只接受一个字符的数据)为单个两字节(16位)Unicode字符(统一的字符编码标准,采用双字节对字符进行编码,中文就是Unicode字符,而英文则是非Unicode字符)。 2、String类型 String类型(也称为字符串数据类型)为0个或多个双字节Unicode字符(最多有近20亿个)。
三、日期类型 Date日期数据类型(64位)表示日期时间,其中存储了从公元1年1月1日0:0:00到公元9999年12月31日11:59:59。注意:日期数据必须用“#”括起来。日期时间数据中可以只有日期,也可以只有时间。 四、布尔类型 Boolean布尔数据类型(32位)只有两个值:真(True)和假(False),经常被用来表示逻辑判断的结果。
五、对象类型 Object对象数据类型为一个32位地址,相当于VB6中的Variant类型,它指向应用程序或其他应用程序中的一个对象。如果数据为Object类型,则它可以指向任何应用程序可处理的对象。它可以接收任何类型数据。当其中包含值类型时,Object类型数据被作为值类型处理;当其中包含引用类型时,Object类型数据被作为引用类型处理。
六、自定义结构类型
在VB6中用户自定义类型的关键字是Type,在vb.net中大部分用Structure,可以包含有一个或多个不同种类的数据类型,尽管结构中的数据可以单独被访问,但是这些数据仍被认为是一个集合整体。 自定义结构类型的定义以Structure关键字开始,以End Structure关键字结束,结构中的元素可以是任意的数据类型的组合,包括其他结构。结构一旦定义出来后就可以被用作变量声明、参数传递以及函数的返回值等用途,下面是一个结构的语法:
如下例定义一个Employee结构:
Structure Employee
Public FirstName As String
Public FamilyName As String
Public Extension As Long
End Structure
用户自定义数据类型占用内存空间是其包含的所有数据类型所占用内存空间的总和。
七、数据类型转换
CBool,CByte,CSByte,CChar,CStr,CDate,CDble,CSng,CDec,CInt,CUInt,CShort,CUShort,CLng,CULng,CObj
1.取整函数
(1)整型转换函数是将小数部分四舍五入掉,使被转换的数值转变为其最接近的整数值。注意:如果小数部分正好是0.5,CInt和CLng会四舍五入到最接近的偶数值。如:CInt(0.5)结果为0,CLng(4.5)结果为4,CInt(7.5)结果为8,CLng(14.7)结果为15。
(2)Fix和Int函数不四舍五入,直接删除小数部分,取得整数值部分。如:Fix(-9.9)结果为-9,Fix(-9.2)结果为-9,Fix(-0.9)结果为0。但Int函数在取负数小数的整数时,会取比当前数值小的整数部分,如:Int(-9.9)结果为-10,(-9.2)结果为-10。所以,当负数小数部分大于0.5时,CInt相当于Int。
(3)CInt返回值为Integer类型,CLng返回值为Long类型;而Fix和Int返回值与被转换的数值类型一致。
2.CType、DirectCast、TryCast(被转换数据,数据类型X)
三个函数均返回数据类型X,但DirectCast和TryCast被转换数据必须继承自或实现数据类型X,否则DirectCast会发生InvalidCastException错误,而TryCast会返回Nothing。例如:
Dim q As Object = 2.37 Dim i As Integer = CType(q,Integer) ' 以下转换会发生错误 Dim j As Integer = DirectCast(q,Integer) Dim f As New System.Windows.Forms.Form Dim c As System.Windows.Forms.Control ' 以下转换成功 c = DirectCast(f,System.Windows.Forms.Control)
3.Parse和ToString方法
Parse是将字符数据转换为其他类型;ToString是将其他类型转换为字符数据。
基础数据类型(除String外).Parse(字符数据)--〉 Parse函数将字符串数据转换为该基础数据类型值,此函数在对字符数据进行转型时比CType,CDate等要快。例:
Dim rq as Date
rq = Date.Parse("3-4-1999)
变量名.ToString() --〉将变量的值转换为文本。ToString可以带有一个格式化文本的字符参数,如:
Dim s As Double,str As String
s = 455454454
str = s.ToString("0.00")
str显示结果为455454454.00
4.Convert类
Convert类提供了许多方法,用来将一个值转换为另一种类型的值。但是在把数据转换为整型数值时,它使用的是.ToInt16 .ToInt32 .ToInt64 .ToUInt16 .ToUInt32 .ToUInt64方法,而不用 .ToInt。如:
Dim i As Integer = Convert.ToInt64("23")
Dim s As Boolen = Convert.ToBoolen(3)
八、判断变量数据类型
VarType(数据X)可以返回一个Integer类型的数值,该数值代表数据X的数据类型。所以判断一个数值的数据类型,可以通过VarType来判断,如:
Dim lx as Integer,dbl As Double,sz As Object
sz = 6.0
lx = VarType(v)
If lx = VarType(dbl) then
MessageBox.Show(sz.ToString & "是Double类型数值")
Else
MessageBox.Show(sz.ToString & "不是Double类型数值")
End If
一、函数名确定它返回的值的数据类型,如下表所示。
函数名 |
返回数据类型 |
expression参数范围 |
CBool |
Boolean 数据类型 (Visual Basic) |
任何有效的Char、String或数值表达式。 |
CByte |
Byte 数据类型 (Visual Basic) |
0 到 255(无符号);舍入小数部分。1 |
CChar |
Char 数据类型 (Visual Basic) |
任何有效的Char或String表达式;只转换String的第一个字符;值可以为 0 到 65535(无符号)。 |
CDate |
Date 数据类型 (Visual Basic) |
任何有效的日期和时间表示法。 |
CDbl |
Double 数据类型 (Visual Basic) |
负值取值范围为 -1.79769313486231570E+308 到 -4.94065645841246544E-324;正值取值范围为 4.94065645841246544E-324 到 1.79769313486231570E+308。 |
CDec |
Decimal 数据类型 (Visual Basic) |
对 于零变比数值,即无小数位数值,为 +/-79,228,162,514,264,337,593,543,950,335。对于具有 28 位小数位的数字,范围是 ?+/-7.9228162514264337593543950335。最小的可用非零数是 0.0000000000000000000000000001 (+/-1E-28)。 |
CInt |
Integer 数据类型 (Visual Basic) |
-2,147,483,648 到 2,647;舍入小数部分。1 |
CLng |
Long 数据类型 (Visual Basic) |
-9,223,372,036,854,775,808 到 9,807;舍入小数部分。1 |
CObj |
Object 数据类型 |
任何有效的表达式。 |
CSByte |
SByte 数据类型 (Visual Basic) |
-128 到 127;舍入小数部分。1 |
CShort |
Short 数据类型 (Visual Basic) |
-32,768 到 32,767;舍入小数部分。1 |
CSng |
Single 数据类型 (Visual Basic) |
负值的取值范围为 -3.402823E+38 到 -1.401298E-45;正值的取值范围为 1.401298E-45 到 3.402823E+38。 |
CStr |
String 数据类型 (Visual Basic) |
CStr的返回值取决于expression参数。请参见返回 CStr 函数的值。 |
CUInt |
UInteger 数据类型 |
0 到 4,294,967,295(无符号);舍入小数部分。1 |
CULng |
ULong 数据类型 (Visual Basic) |
0 到 18,446,744,073,709,551,615(无符号);舍入小数部分。1 |
CUShort |
UShort 数据类型 (Visual Basic) |
0 到 65,535(无符号);舍入小数部分。1 |
1小数部分可能要进行称为“四舍六入五成双”的特殊类型舍入。有关更多信息,请参见“备注”。
二、Convert
备注
通常,在Convert类或在独立类型结构或类中,应优先使用 Visual Basic 类型转换函数,其次使用 .NET Framework 方法(例如ToString())。Visual Basic 函数设计用于优化与 Visual Basic 代码之间的交互,并且这些函数使源代码更简短、更易阅读。另外,.NET Framework 转换方法产生的结果不一定与 Visual Basic 函数产生的结果相同,例如当将Boolean转换为Integer的时候。有关更多信息,请参见数据类型的疑难解答。
行为
-
强制转换。通常,可以使用数据类型转换函数将运算结果强制转换为某一特定数据类型而非默认数据类型。例如,在通常发生单精度、双精度或整型运算的情况下,使用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 函数 (Visual Basic)不同,后者截断而不是舍入一个数字的小数部分。此外,Fix和Int总是返回与传入的数据类型相同的值。
-
日期/时间转换。使用IsDate 函数 (Visual Basic)可确定一个值是否可转换为日期和时间。CDate能够识别日期文本和时间文本,但不能识别数值。若要将 Visual Basic 6.0Date值转换为 Visual Basic 2005Date值,可以使用System.DateTime.FromOADate(System.Double)方法。
-
中性日期/时间值。Date 数据类型 (Visual Basic)始终包含日期和时间信息。为进行类型转换,Visual Basic 将 1/1/0001(公元 1 年 1 月 1 日)作为日期的“中性值”,将 00:00:00(午夜)作为时间的中性值。如果将Date值转换为字符串,CStr的结果字符串中将不包含中性值。例如,如果将#January 1,0001 9:30:00#转换为字符串,结果为“9:30:00 AM”;日期信息被删除了。但是,日期信息仍然保留在原来的Date值中,并可以使用DatePart 函数 (Visual Basic)等函数进行恢复。
-
区域差异。涉及字符串的类型转换函数根据应用程序的当前区域设置进行转换。例如,CDate依据系统的区域设置来识别日期的格式。必须以正确的顺序为区域设置提供日、月、年数据,否则可能无法正确解释日期。系统无法识别包含星期几的字符串(如“Wednesday”)的长日期格式。 如果需要以区域设置指定的格式之外的格式在值的字符串表示形式之间转换,则不能使用 Visual Basic 类型转换函数。如果进行转换,请使用该值类型的ToString(IFormatProvider)方法和Parse(String,IFormatProvider)方法。例如,将字符串转换为Double时,使用System.Double.Parse(System.String,System.IFormatProvider),将Double类型的值转换为字符串时,使用System.Double.ToString(System.IFormatProvider)。
三、CType 函数
CType 函数采用第二个参数typename,并且将expression强制转换为typename,其中typename可以是存在有效转换的任何数据类型、结构、类或接口。
有关CType与其他类型转换关键字的比较,请参见DirectCast和TryCast。
CBool 示例
下面的示例使用CBool函数将表达式转换为Boolean值。如果表达式的计算结果为非零值,CBool将返回True;否则返回False。
四、
Val 函数
以适当类型的数值形式返回包含于字符串内的数字。
Public Overloads Function Val(ByVal InputStr As String) As Double
' -or-
Public Overloads Function Val(ByVal Expression As Object) As Double
' -or-
Public Overloads Function Val(ByVal Expression As Char) As Integer
参数
-
Expression,InputStr
-
必选。任何有效的String表达式、Object变量或Char值。如果Expression是Object类型,它的值必须可以转换为String,否则,将出现ArgumentException错误。
异常
异常类型 |
错误号 |
条件 |
OverflowException |
6 |
InputStr太大。 |
InvalidCastException |
13 |
数字格式错误。 |
ArgumentException |
438 |
Object类型表达式不能转换为字符串。 |
如果正在升级使用非结构化错误处理方式的 Visual Basic 6.0 应用程序,请参见“错误号”一列。(您可以根据Number 属性(Err 对象)比较错误号。)然而,如果可能,应当考虑用Visual Basic 的结构化异常处理概述替换这种错误控制。
Val函数在发现第一个不能将其识别为数字的字符时,将停止读入字符串。那些通常被认为是数值的一部分的符号和字符,例如美元符号与逗号,都不能被识别。但是该函数可以识别基数前缀&O(八进制)和&H(十六进制)。空白、制表符和换行符都会从参数中排除。
下面的调用返回值 1615198。
Val(" 1615 198th Street N.E.")
下面的调用返回十进制值 -1。
Val("&HFFFF")
注意 |
Val函数只将句点 (.) 识别为有效的小数点分隔符。当使用不同的小数点分隔符时(如在国际应用程序中),则应使用CDbl或CInt将字符串转换为数字。若要将特定区域中的数字的字符串表示形式转换为数值,请使用 Numeric 类型的Parse(String,System.IFormatProvider)。 |
五、
在Visual Basic 2005中将加入一个新的运算符——TryCast,相当于C#的as运算符。我一直希望VB有这样一个运算符。VB目前的类型转换运算符主要有 CType和DirectCast。他们的用法几乎一样。我详细比较了一下这两个运算符,得出以下结论:
1、在转换成引用类型时,两者没有什么区别,都是直接调用castclass指令,除非重载了类型转换运算符CType。DirectCast运算符是不能重载的。
2、转换成值类型时,CType会调用VB指定的类型转换函数(如果有的话),比如将String转换为Int32时,就会自动调用 VisualBasic.CompilerServices.IntegerType.FromString,而将Object转换为Int32则会调用 FromObject。其他数值类型转换为Int32时,CType也会调用类型本身的转换方法实施转换。DirectCast运算符则很简单,直接将对 象拆箱成所需类型。
所以在用于值类型时,CType没有DirectCast快速但可以支持更多的转换。在C#中,类型转换则为(type)运算符和as运算符。 (type)运算符的工作方式与VB的DirectCast很相似,也是直接拆箱或castclass的,但是如果遇到支持的类型转换(如long到 int),(type)运算符也会调用相应的转换方法,但不支持从String到int的转换。C#另一个运算符as则更加智能,它只要判断对象的运行实 例能否转成目标类型,然后就可以省略castclass指令,直接按已知类型进行操作,而且编译器还可以自动对as进行优化,比如节省一个对象引用等。所 以在将Object转换成所需的类型时,as是最佳选择。
由于as有很多优点,Visual Basic 2005将这一特性吸收了过来,用TryCast运算符就可以获得和as一样的效果,而且语法与DirectCast或CType一样。
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|