17

这个问题源于这里。我在 VS 中尝试了这个语句,看看会发生什么:

Len(Name <= 3)

根据这个答案这个答案,布尔值应该消耗 4 个字节。根据 MSDN,VB 中的 Len 函数

返回一个整数,其中包含字符串中的字符数或存储变量所需的标称字节数。

Name <= 3应该将 3 转换为 String 并执行字符串比较,返回一个布尔值,所以Len应该计算其中的字节数,应该是 4。出于某种原因,上面的代码返回 2,不管第二个参数。换句话说,Len(True)也返回 2。尝试了不同的平台目标(32 和 64)——同样的事情。

为什么Len(Boolean)返回 2 而不是 4?

4

2 回答 2

16

使用用户定义的类型和对象变量,Len 函数返回将由 FilePut 函数写入文件的大小。如果一个对象包含一个字符串,它将返回字符串的长度。如果 Object 包含任何其他类型,它将返回对象的大小,因为它将由 FilePut 函数写入文件。

Len() 是一个遗留函数,它只能在从上一代 Visual Basic 项目移植的代码中使用。它通常出现在涉及 VB 值的二进制序列化的代码中。在那些旧版本中,基本类型的大小不同。 Integer例如,是 16 位,解释了您在网络中发现的大量使用 Long 的错误 pinvoke 声明。并且Boolean是一个 VARIANT_BOOL,一个 16 位的值。此外,通过将其True值转换为 -1 而不是 1,这很古怪。

显然,采用 .NET 大小对于 VB6 程序编写的文件中存在的大量数据来说是一个重大的改变。或通过 TCP 连接发送的二进制数据。等等。因此,Len() 函数返回旧尺寸。

于 2013-01-20T15:44:56.193 回答
2

根据 MSDN 的数据类型摘要 (VS2012),布尔值的大小取决于实现平台。但是,如果您查看VS2003 的同一页面,它确实说布尔值是 2 个字节。

ECMA-335 第 III.1.1.1 节规定:

评估堆栈仅保存 4 或 8 字节整数,但其他位置(参数、局部变量、静态、数组元素、字段)可以保存 1 或 2 字节整数。出于堆栈操作的目的,bool (§III.1.1.2) 和 char 类型分别被视为无符号的 1 字节和 2 字节整数。从这些位置加载到堆栈中会将它们转换为 4 字节值

第 III.1.1.2 节指出:

CLI 布尔类型在内存中占用 1 个字节。全为零的位模式表示值为假。设置了任何一个或多个位的位模式(类似于非零整数)表示值为真。出于堆栈操作的目的,布尔值被视为无符号的 1 字节整数


因此,鉴于此,我对您为什么得到 2 而不是 1 感到更加困惑

于 2013-01-20T15:40:40.763 回答