.NET中的数据类型的一些变化

80酷酷网    80kuku.com

  数据|数据类型今天在做一个关于IC卡读写的程序,用到了一个IC卡读写器,有一个配套的dll动态库和一些库函数的说明,但是调试的时候总是会遇到一些奇怪的现象。VB6的示例中可以的操作,在我的程序中就会出现“未将对象引用设置到对象的实例”等等错误。折腾了半天也没有什么进展。后来用.NET的升级向导将那个VB6的实力程序升级,发现模块中函数的声明有一些变化。

VB6中声明:

Declare Function srd_45d041 Lib "mwic_32.dll" (ByVal icdev As Long, ByVal page As Integer, ByVal offset As Integer, ByVal le As Long, ByVal data_buffer$) As Integer

升级后.NET的声明: Declare Function srd_45d041 Lib "mwic_32.dll" (ByVal icdev As Integer, ByVal page As Short, ByVal offset As Short, ByVal le As Integer, ByVal data_buffer As String) As Short  VB6中Long类型在.NET中变成了Integer,而Integer变成了Short。就这么一点小小的问题搞得我郁闷了半天。把程序调试通过以后,我查了一下MSDN Library,发现.NET的数据类型和VB6的存在一些变化。具体的可以看下面这两张表。

表1 VB6中的数据类型

数据类型

存储空间大小

范围

Byte

1 个字节

0 到 255

Boolean

2 个字节

True 或 False

Integer

2 个字节

-32,768 到 32,767

Long
(长整型)

4 个字节

-2,147,483,648 到 2,147,483,647

Single
(单精度浮点型)

4 个字节

负数时从 -3.402823E38 到 -1.401298E-45;正数时从 1.401298E-45 到 3.402823E38

Double
(双精度浮点型)

8 个字节

负数时从 -1.79769313486232E308 到
-4.94065645841247E-324;正数时从4.94065645841247E-324 到 1.79769313486232E308

Currency
(变比整型)

8 个字节

从 -922,337,203,685,477.5808 到 922,337,203,685,477.5807

Decimal

14 个字节

没有小数点时为 +/-79,228,162,514,264,337,593,543,950,335,而小数点右边有 28 位数时为 +/-7.9228162514264337593543950335;最小的非零值为 +/-0.0000000000000000000000000001

Date

8 个字节

100 年 1 月 1 日 到 9999 年 12 月 31 日

Object

4 个字节

任何 Object 引用

String
(变长)

10 字节加字符串长度

0 到大约 20 亿

String
(定长)

字符串长度

1 到大约 65,400

Variant
(数字)

16 个字节

任何数字值,最大可达 Double 的范围

Variant
(字符)

22 个字节加字符串长度

与变长 String 有相同的范围

用户自定义
(利用 Type)

所有元素所需数目

每个元素的范围与它本身的数据类型的范围相同。

 表2  VB.NET中的数据类型

Visual Basic 类型

公共语言运行库类型结构

名义存储分配

取值范围

Boolean

System.Boolean

2 个字节

True 或 False

Byte

System.Byte

1 个字节

0 到 255(无符号)。

Char

System.Char

2 个字节

0 到 65535(无符号)。

Date

System.DateTime

8 个字节

0001 年 1 月 1 日凌晨 0:00:00 到 9999 年 12 月 31 日晚上 11:59:59。

Decimal

System.Decimal

16 个字节

0 到 +/-79,228,162,514,264,337,593,543,950,335 之间不带小数点的数;
0 到 +/-7.9228162514264337593543950335 之间带 28 位小数的数;最小非零数为
+/-0.0000000000000000000000000001 (+/-1E-28)。

Double
(双精度浮点型)

System.Double

8 个字节

负值取值范围为 -1.79769313486231570E+308 到 -4.94065645841246544E-324;正值取值范围为 4.94065645841246544E-324 到 1.79769313486231570E+308。

Integer

System.Int32

4 个字节

-2,147,483,648 到 2,147,483,647。

Long
(长整型)

System.Int64

8 个字节

-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。

Short

System.Int16

2 个字节

-32,768 到 32,767。

Object

System.Object(类)

4 个字节

任何类型都可以存储在 Object 类型的变量中。

Single
(单精度浮点型)

System.Single

4 个字节

负值取值范围为 -3.4028235E+38 到 -1.401298E-45;正值取值范围为 1.401298E-45 到 3.4028235E+38。

String
(变长)

System.String(类)

取决于实现平台

0 到大约 20 亿个 Unicode 字符。

用户定义的类型
(结构)

(从System.ValueType继承)

取决于实现平台

结构中的每个成员都有由自身数据类型决定的取值范围,并与其他成员的取值范围无关。

 从两张表中可以清楚地看到VB6中的Integer类型是2个字节长度的,Long是4个字节长度的。在.NET中Interger变成了4个字节,Long是8个字节。多了一个Short类型,是2个字节的。数据类型的字长不一样导致了调用库函数时数据类型转化的冲突,所以也就出现了很多奇怪的问题,不过现在问题顺利解决,希望这些经验能对.NET的初学者有一些帮助。

分享到
  • 微信分享
  • 新浪微博
  • QQ好友
  • QQ空间
点击: