字符串占用多少字节?

Moh*_*ar 28 c# string byte

谁能告诉我下面的字符串会占用多少字节?

string abc = "a";
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 35

从我关于字符串的文章:

至少在当前的实现中,字符串占用20+(n/2)*4字节(向下舍入n/2的值),其中n是字符串中的字符数.字符串类型的不寻常之处在于对象本身的大小各不相同.执行此操作的唯一其他类(据我所知)是数组.本质上,字符串是内存中的字符数组,加上数组的长度和字符串的长度(以字符为单位).数组的长度并不总是与字符长度相同,因为字符串可以在mscorlib.dll中"过度分配",以便更容易构建它们.(例如,StringBuilder执行此操作.)虽然字符串对外部世界是不可变的,但mscorlib中的代码可以更改内容,因此StringBuilder创建的字符串具有比当前内容所需的更大的内部字符数组,然后追加到该字符串,直到字符数组不再大到可以处理,此时它会创建一个带有更大数组的新字符串.字符串长度成员的顶部位还包含一个标志,表示该字符串是否包含任何非ASCII字符.这允许在某些情况下进行额外的优化.

我怀疑这是在我有机会使用64位CLR之前编写的; 我怀疑在64位上每个字符串占用4或8个字节.

编辑:我最近写了一篇博客文章,其中包括64位信息(并且与上面的x86略有矛盾......)


Tam*_*ran 10

基本上,每个字符串对象需要对象数据的常量20个字节.缓冲区每个字符需要2个字节.字符串的内存使用估计值:20 +(2*Length).因此,正常情况下CLR中此字符串的内存:22个字节

然而,当我们将此字符串传递或发送到另一端或任何其他用途时,我们不需要这么多内存(我们从不需要对象数据的20个字节).因此,当您使用它时,它取决于您选择的编码类型.

对于默认编码,字符需要1个字节.

因此,默认编码的答案是1个字节.

您可以查看以下代码:

Encoding.Default.GetBytes("a"); //It will give you a byte array of size 1.
Encoding.Default.GetBytes("ABC"); //It will give you a byte array of size 3.
Run Code Online (Sandbox Code Playgroud)