C# 字符串长度的高位标志

C# 字符串长度的高位标志,c#,string,unsafe,C#,String,Unsafe,讨论.NET/C#中的一些字符串内部结构。有趣的小道消息之一: m_stringLength 这是字符串的逻辑长度,由string.length返回。 由于许多高位用于附加标志以提高性能,因此字符串的最大长度被限制在比32位系统的UInt32.Max小得多的限制范围内。其中一些标志表示字符串包含简单字符,如普通ASCII,不需要调用复杂的UNICODE算法进行排序和比较测试 我知道,这是否意味着额外的空间用于前面提到的字符串标志(0-ASCII,1-wide) 这与2.0及以上版本的mono相关

讨论.NET/C#中的一些字符串内部结构。有趣的小道消息之一:

m_stringLength
这是字符串的逻辑长度,由string.length返回。 由于许多高位用于附加标志以提高性能,因此字符串的最大长度被限制在比32位系统的UInt32.Max小得多的限制范围内。其中一些标志表示字符串包含简单字符,如普通ASCII,不需要调用复杂的UNICODE算法进行排序和比较测试

我知道,这是否意味着额外的空间用于前面提到的字符串标志(0-ASCII,1-wide)


这与2.0及以上版本的mono相关吗?我正在围绕字符串编写一个简单的自定义包装器,以使其可变,尽管该字符串目前不用于排序或比较,但我想知道是否应该分配新字符串,以预先填充ASCII或UNICODE(即,如果我知道/假设内容)char,因此默认情况下将设置该标志。

该文章非常旧;它专门讨论.NET1。对于.NET2以后的版本,我很怀疑这些信息是否准确。至少很容易验证,
m_stringLength
只是长度而已。即使这些标志存在,也没有任何意义“先发制人”地填充字符串,因为它们是不可变的。而
binarydreader
并不专门读取字符串,这只适用于
read7bitencodeint
。公平点。不过,我不确定链接的代码打算展示什么。我链接它是因为
m_stringLength
在那里没有单独处理,事实上,它的分配和读取没有考虑在任何长度操作之前应该屏蔽的可能高位。然而,我的评论也是错误的,因为在运行时的某些部分中,字符串表示是用()来处理的。但是在这里,
m_flags
是一个单独的字段,没有填入长度,并且
SString
不与托管字符串1-1对应。这可能是v1中一件事的演变。嗯,我明白了。谢谢,这让我的生活更轻松。看起来他们不再快速进行ascii比较,甚至在代码中,这是硬编码的错误,这篇文章非常陈旧;它专门讨论.NET1。对于.NET2以后的版本,我很怀疑这些信息是否准确。至少很容易验证,
m_stringLength
只是长度而已。即使这些标志存在,也没有任何意义“先发制人”地填充字符串,因为它们是不可变的。而
binarydreader
并不专门读取字符串,这只适用于
read7bitencodeint
。公平点。不过,我不确定链接的代码打算展示什么。我链接它是因为
m_stringLength
在那里没有单独处理,事实上,它的分配和读取没有考虑在任何长度操作之前应该屏蔽的可能高位。然而,我的评论也是错误的,因为在运行时的某些部分中,字符串表示是用()来处理的。但是在这里,
m_flags
是一个单独的字段,没有填入长度,并且
SString
不与托管字符串1-1对应。这可能是v1中一件事的演变。嗯,我明白了。谢谢,这让我的生活更轻松。看起来它们不再快速进行ascii比较,甚至在代码中也硬编码为false