|
.NET中的数据类型的一些变化 今天在做一个关于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的初学者有一些帮助。
返回类别: 教程 上一教程: 使用.net framework中常用类在2.0版中的新功能 下一教程: 标题 VS.NET为企业做好了预备吗?
您可以阅读与".NET中的数据类型的一些变化"相关的教程: · .Net正式版中的一些Bug及其解决方案 · 将ASP.net中的Table中的数据导入到Execl · 在 ASp+ 中的一些可能会用到的 小函数 · 【转载】关于Windows.Net和VisualStudio.Net的一些观察 · Win32类型和.net类型的对应表
|