2013-04-25 2 views
16

С Delphi XE4 для платформы iOS был введен новый тип строки: неизменяемые нулевые строки. До сих пор у Delphi была копия на запись изменяемых строк. Итак, вопрос в том, что это значит для моего будущего программирования? Существуют ли какие-либо преимущества одного типа струны над другим? Каковы подводные камни, которые мне нужно позаботиться при переключении на новый тип строки (кроме очевидной базы 0 против 1)?Непрерывные строки Delphi XE4

+0

Обратите внимание, что это компилятор, если строки основаны на нуле. Конечно, не стоит смешивать оба пути, но по крайней мере вы сами можете решить, когда делать переход. – jpfollenius

+0

Мы должны использовать класс 'TStringBuilder' для обработки строк и' TStringHelper' для общей обработки строк. –

+0

Тип 'String' сам по себе такой же, как и раньше, это влияет только на оператор' [] '. Неизменяемость просто означает, что компилятор не позволяет назначить 'Char' для оператора, а директива' {$ ZEROBASEDSTRINGS} 'влияет только на то, как компилятор интерпретирует индексы, переданные оператору. Сам тип 'String' не был переработан. –

ответ

17

Согласно Marco Cantù's whitepaper, тип данных в целевой точке iOS XE4 не является неизменным, хотя он, кажется, противоречит самому себе.

Он говорит:

В новом Delphi LLVM на основе компилятора, есть один строковый тип, представляющий Unicode строк (utf16) и сопоставляется с текущим типом строки в Delphi XE3 (псевдоним для UnicodeString в компиляторе Windows). Однако этот новый тип строки использует другую модель управления памятью. Строковый тип по-прежнему подсчитывается по ссылке, но он неизменен, что означает, что вы не можете изменять содержимое строки после ее создания.

Но затем он продолжает говорить:

Другими словами строки теперь Unicode на основе, в ближайшее время к стать непреложным и счетчиком ссылок.

А также:

Где вещи начинают меняться, однако, при изменении существующего строки, не заменив его новое значение (в этом случае вы получите новые строка), но при изменении одного из его элементов, как показано на эту строку кода (а также в предыдущем разделе, где я представил тему):

Str1 [3] := 'x'; 

Все компиляторы Delphi используют семантику copy-on-write: если строка, которую вы установили , имеет несколько ссылок, она сначала копируется (корректировка опорных отсчетов по различным строкам, участвующим по мере необходимости) и , позже измененных.

Новый компилятор делает что-то очень похожее на классическое. Он реализует механизм копирования на запись, если только нет ссылки на строку , и в этом случае строка изменяется в . В качестве примера рассмотрим следующий код, который выводит в ячейку памяти фактической строки.

Затем он показывает изображение устройства iOS с мутировавшимися строками.

И в official documentation мы имеем:

Строки неизменны (константа), так что вы не можете индексировать в строку как массив и манипулировать символов в строке. Если вы попытаетесь изменить значение , компиляторы Delphi могут выдать сообщение W1068 Изменение строк на месте может не поддерживаться в будущем (Delphi).Вы можете указать, выбрано ли сообщение x1068 как предупреждение или ошибка. На странице «Советы и предупреждения» установите предупреждение «Изменение строк на месте ....» на «Истина» или «Ошибка».

Поэтому я интерпретирую все это как значение, что выпуск XE4 компилятора iOS по-прежнему имеет изменяемые строки. Разработчики действительно не хотят, чтобы вы больше мутировали свои строки и говорите вам, что строки неотменяемы для мобильных компиляторов. Но они все еще кажутся изменчивыми. Иди цифра!

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

Вы можете подготовиться к этой будущей версии сейчас, установив

{$WARN IMMUTABLE_STRINGS WARN} 

, который даст вам представление о влиянии изменений. Если вы хотите, чтобы пристегнуться и остановить мутацию строки, вы можете сделать это:

{$WARN IMMUTABLE_STRINGS ERROR} 

После того, как вы делаете, что вам нужно, чтобы преобразовать код, обращающийся отдельные строки элементов. Я подозреваю, что вы будете удивлены, как мало такого кода есть. Я только что составил 600 000 строк кода и увидел только 120 экземпляров предупреждения. И большинство из них были в сторонних подразделениях. Я видел, как это изменение изменилось, но я, честно говоря, не верю, что очень много кода мутирует строки. В подавляющем большинстве случаев строки создаются путем конкатенации или вызовами таких функций, как Format. Этот код не влияет на этот код.

Я не думаю, что есть какие-то большие подводные камни. Вы можете использовать {$WARN IMMUTABLE_STRINGS ...}, чтобы компилятор проведет вас через этот процесс. Любой код, который мутирует строки, должен быть преобразован для использования TStringBuilder.

Что касается преимуществ неизменности, я отсылаю вас к Why .NET String is immutable?

Если вы используете традиционные компилятор для Windows или OSX, то я не вижу никаких оснований изменять. Компилятор iOS совершенно новый. Изменения в неизменяемые строки были перемещены, но этого никогда не произойдет. Это может произойти только на мобильных компиляторах и никогда не на традиционных компиляторах. Прямо сейчас, я сидел напряженно и жду, чтобы посмотреть, как все это разыгрывается.

+3

Тим Андерсон также смущен тем, насколько непреложной является новая неизменяемая мобильная строка: http://www.itwriting.com/blog/7347-changes-in-the-delphi-language-for-arm-and-mobile- support.html –

+3

Woah, я немного боюсь перейти к выводам, но это звучит как еще одна плохая идея разработчиков Delphi. Давайте разложим совместимость, чтобы сделать строки менее полезными, отличным планом. – himself

+3

@himself Есть преимущества с неизменностью. И в любом случае это очень незначительное изменение. Пренебрегая сторонними библиотеками, с которыми будет работать кто-то другой, я мог бы исправить свою кодовую базу примерно через час.Я предпочел бы, чтобы какая-то часть языка была удалена, даже если это означает некоторую боль на нашей стороне. –

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