String.Substring (): Копировать или Ссылка? - PullRequest
4 голосов
/ 02 февраля 2012

Когда строка создается с использованием метода SubString (), является ли полученная строка копией элементов исходной строки (так что теперь есть 2 ячейки памяти с одинаковой информацией), или это ссылка на существующую памятьместоположение?

Если это копия, есть ли способ сделать ее ссылкой?

Ответы [ 3 ]

5 голосов
/ 02 февраля 2012

В C # строки неизменны *, но не постоянны . Это означает, что новая строка, являющаяся результатом метода SubString, не разделяет общую часть со старой строкой. Здесь - прекрасное объяснение Эрика Липперта.

* операция над строкой вернет новый строковый объект

5 голосов
/ 02 февраля 2012

Это копия, и вы не можете иметь string, которая является ссылкой на часть другой строки.Строка .net не поддерживается массивом, она содержит встроенные данные char.т. е. это класс переменной длины, похожий на массив.

Хотя эта под-эталонная модель является возможной реализацией (я думаю, что строки Java - это просто кусочки в массивы символов), это может привести к странному поведению, гдехранение небольшой подстроки сохраняет всю строку в памяти, что является распространенной ошибкой для подстрок java.Я предполагаю, что разработчики .net хотели избежать таких проблем.

Вы можете использовать свою собственную строку типа type, у которой есть это свойство.Например, вы можете работать с кусочками в массиве символов с ArraySegment<char>.

0 голосов
/ 02 февраля 2012

Это новая строка. Вы можете добавить что-то, скажем, сохраненные начальные и конечные позиции какой-либо другой строки, например, аргументы, которые вы отправите подстроке, если вы ее вызвали. Если это был фиксированный шаблон (или, по крайней мере, его можно было исправить за известный интервал, вы могли бы его предварительно нарезать, или использовать StringBuilder, или Stream с TextReader.

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

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