Подтвердить что ты не робот

Внутренности System.String

Я использовал отражение, чтобы посмотреть на внутренние поля System.String, и я нашел три поля:

m_arrayLength

m_stringLength

m_firstChar

Я не понимаю, как это работает.

m_arrayLength - длина некоторого массива. Где этот массив? По-видимому, это не поле члена класса string.

m_stringLength имеет смысл. Это длина строки.

m_firstChar - это первый символ в строке.

Итак, мой вопрос в том, где остальные символы для строки? Где содержимое строки хранится, если нет в классе строк?

4b9b3361

Ответ 1

Большая часть реализации System.String содержится в собственном коде (C/С++), а не в управляемом коде (С#). Если вы посмотрите на декомпилированный код, вы увидите, что большинство "интересных" или "основных" методов украшены этим атрибутом:

[MethodImpl(MethodImplOptions.InternalCall)]

В С# реализованы только некоторые вспомогательные/удобные API.

Итак, где хранятся символы для строки? Это совершенно секретно! Глубоко внутри встроенного кода CLR.

Ответ 2

Первый char обеспечивает доступ (через &m_firstChar) к адресу в памяти первого символа в буфере. Длина указывает, сколько символов находится в string, что делает .Length эффективным (лучше, чем поиск nul char). Обратите внимание, что строки могут быть увеличены (особенно если они созданы с помощью StringBuilder и нескольких других сценариев), поэтому иногда фактический буфер на самом деле длиннее строки. Поэтому важно отслеживать это. Например, StringBuilder фактически мутирует строку в своем буфере, поэтому ему нужно знать, сколько она может добавить, прежде чем создавать более крупный буфер (см., Например, AppendInPlace).

Ответ 3

Я бы сразу подумал, что m_firstChar не является первым символом, а скорее указателем на первый символ. Это будет иметь больший смысл (хотя, поскольку я не привязан к источнику, я не могу быть уверенным).

Не имеет смысла хранить первый символ строки, если вы не хотите ослепительно быстрой операции s.substring(0,1):-) Там хорошая вероятность, что сами персонажи (то, что три поля ссылаются) будут выделены отдельно от фактического объект.

Ответ 4

Правильный ответ на разницу между строкой и System.string здесь: string vs System.String

Нет ничего о встроенных реализациях