внутренности System.String - PullRequest
12 голосов
/ 21 января 2010

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

m_arrayLength

m_stringLength

m_firstChar

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

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

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

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

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

Ответы [ 4 ]

12 голосов
/ 21 января 2010

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

10 голосов
/ 21 января 2010

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

[MethodImpl(MethodImplOptions.InternalCall)]

Только некоторые из вспомогательных / вспомогательных API реализованы в C #.

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

2 голосов
/ 21 января 2010

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

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

0 голосов
/ 20 марта 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...