这个问题源于here。我在VS中尝试了下面的语句,看看会发生什么:
Len(Name <= 3)
根据this answer和this one的说法,Boolean应该占用4个字节。根据MSDN的说法,Len Function in VB
返回一个整数,其中包含字符串中的字符数或存储变量所需的标称字节数。
Name <= 3
应该将3转换为字符串,并执行字符串比较,返回一个布尔值,因此Len
应该计算其中的字节数,它应该是4。由于某种原因,上面的代码返回2,而不考虑第二个参数。换句话说,对于不同的平台目标(32和64),Len(True)
也返回2.
为什么 Len(Boolean)
返回2而不是4?
发布于 2013-01-20 23:44:56
对于用户定义的类型和对象变量,Len函数返回FilePut函数将其写入文件时的大小。
如果一个对象包含一个字符串,它将返回字符串的长度。如果对象包含任何其他类型,它将返回对象的大小,因为它将由FilePut函数写入文件。
Len()是一个遗留函数,应该只在从上一代Visual Basic项目移植过来的代码中使用。它通常出现在涉及VB值的二进制序列化的代码中。基本类型的大小在这些旧版本中是不同的。例如,Integer
是16位的,解释了你在web上发现的大量使用Long的糟糕的pinvoke声明。Boolean
是一个隐藏在引擎盖下的VARIANT_BOOL,一个16位的值。更奇怪的是,将其True
值转换为-1而不是1。
显然,对于由VB6程序编写的文件中存在的大量数据,采用.NET大小将是一个严重的破坏性更改。或通过TCP连接发送的二进制数据。等等。因此,Len()函数返回遗留的大小。
发布于 2013-01-20 23:40:41
根据MSDN的Data Type Summary (VS2012),布尔值的大小取决于实现平台。但是,如果您查看the same page for 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个字节。
全零的位模式表示值为false。设置了任何一个或多个位(类似于非零整数)的位模式表示值为true。出于堆栈操作的目的,布尔值被视为无符号1字节整数
因此,考虑到这一点,我感到更困惑的是,为什么你得到2而不是1
https://stackoverflow.com/questions/14425984
复制相似问题