System.String的内部

问题描述 投票:12回答:4

我使用反射来查看System.String的内部字段,我找到了三个字段:

m_arrayLength

m_stringLength

m_firstChar

我不明白这是如何工作的。

m_arrayLength是某个数组的长度。这个阵列在哪里?它显然不是字符串类的成员字段。

m_stringLength很有意义。这是字符串的长度。

m_firstChar是字符串中的第一个字符。

所以我的问题是字符串的其余字符在哪里?如果不在字符串类中,则存储字符串的内容在哪里?

c# string reflection
4个回答
10
投票

System.String的大部分实现都是本机代码(C / C ++)而不是托管代码(C#)。如果您查看反编译代码,您会看到大多数“有趣”或“核心”方法都使用此属性进行修饰:

[MethodImpl(MethodImplOptions.InternalCall)]

只有一些辅助/便利API在C#中实现。

那么字符串的字符存储在哪里?这是绝密!深入了解CLR的核心本机代码实现。


12
投票

第一个char提供访问(通过&m_firstChar)到缓冲区中第一个字符的内存中的地址。长度告诉它在string中有多少个字符,使.Length有效(比寻找nul字符更好)。请注意,字符串可以超大(特别是如果使用StringBuilder和其他一些场景创建),因此有时实际缓冲区实际上比字符串长。所以跟踪这个很重要。例如,StringBuilder实际上会在其缓冲区中变换一个字符串,因此在创建更大的缓冲区之前需要知道它可以添加多少(例如,参见AppendInPlace)。


2
投票

我会立刻想到m_firstChar不是第一个字符,而是指向第一个字符的指针。这会更有意义(虽然,因为我不知道来源,我不能确定)。

存储字符串的第一个字符是没有意义的,除非你想要一个快速的s.substring(0,1)操作:-)字符本身(三个字段所暗示的)很可能将与实际对象分开分配。


0
投票

关于string和System.string之间差异的正确答案在这里:string vs System.String

本机实现没有任何内容

© www.soinside.com 2019 - 2024. All rights reserved.