C# 一个字符串将占用多少字节?

C# 一个字符串将占用多少字节?,c#,string,byte,C#,String,Byte,谁能告诉我下面的字符串将占用多少字节 string abc = "a"; 从我的: 在当前实现中,字符串至少占用20+(n/2)*4字节(向下舍入n/2的值),其中n是字符串中的字符数。字符串类型是不寻常的,因为对象本身的大小不同。据我所知,其他唯一能做到这一点的类是数组。本质上,字符串是内存中的字符数组,加上数组的长度和字符串的长度(以字符为单位)。数组的长度并不总是与字符的长度相同,因为在mscorlib.dll中字符串可能会被“过度分配”,以使构建它们更容易。(例如,StringBuil

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

string abc = "a";
从我的:

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

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


编辑:我最近写了一篇包含64位信息的文章(与上面关于x86的内容略有矛盾…

如果您询问
字符串对象的大小,那么询问其大小是错误的,如果没有调试器,就不可能说它到底是什么。也不确定是否可以使用调试器<代码>字符串
在内部使用指针


若您询问它包含的字符序列的大小,那个么它是4,因为字符串存储在UTF-16中。基本多语言平面中的所有字符都用两个字节编码。

基本上,每个字符串对象需要一个恒定的20字节作为对象数据。 缓冲区要求每个字符有2个字节。 字符串的内存使用估计(字节):20+(2*长度)。 所以,通常这个字符串的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.

它在源代码中占用17个字节。请详细说明你的问题。您是否在运行时在内存中思考,当编码为字节[]时,……您需要澄清一些事情,例如:这个字符串,您将在哪里保存它?在内存中,作为.NET类型的“字符串”?在文件中?用哪种编码?你为什么感兴趣?如果在.NET的内存中,具有相同内容的每个附加字符串不一定会占用更多的内存,因为旧的字符串可以重用。编辑只需花费很少的内存,因此您真的不应该关心它:-)嗯,如果你想在内存中存储大量的字符串,这会使字符串变得非常不受欢迎……因此根据你的文章,一个1字符的字符串需要20个字节。20字节是对象数据。那么字符存储在哪里?:-)@梅兹:不知道你说的“20字节是对象数据”是什么意思。你能澄清一下吗?另请参阅,以获取更多的最新信息-将在中添加该信息。我假设常量“20”是与字符串内容无关的字符串对象的内部细节的大小。我刚刚找到你的解释,
null
在一个字符串中需要2个字节。我猜20实际上是“18+2表示空值”,这就是为什么空字符串和1个字符的字符串占用相同的内存量。@meze:嗯,我的另一篇博文有一个稍微不同的公式:14+n*2,四舍五入到最接近的4字节。这将为1个字符的字符串提供16个字节,而不是20个字节。我不确定哪一个是准确的,即时的。那没关系。这取决于使用时选择的编码类型。