2012-02-01 2 views
4

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

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

ответ

5

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

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

5

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

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

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

0

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

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

Смежные вопросы