布尔是在.NET中的两个字节吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

我在VS中尝试了这个声明来看看会发生什么:

Len(Name <= 3)

布尔应该消耗4个字节。根据MSDN,Len Function在VB中

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

Name <= 3应将3转换为字符串并进行字符串比较,返回一个布尔值,因此Len应计算其中的字节数,该字节数应为4.由于某种原因,无论第二个参数如何,上述代码都返回2。换句话说,Len(True)也返回2.针对不同的平台目标(32和64)尝试 - 同样的事情。

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

提问于
用户回答回答于

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

Len()是一个遗留函数,它只能用于从前一代Visual Basic项目移植过来的代码。它通常出现在涉及VB值二进制序列化的代码中。这些旧版本的基本类型的大小不同。 Integer以16位为例,解释了在Web中使用Long的不良拼音声明的数量。并且Boolean是一个16位值的引擎盖下的VARIANT_BOOL。此外,通过将其True值转换为-1而不是1转换为古怪。

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

用户回答回答于

根据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而感到困惑

扫码关注云+社区