Почему Delphi предупреждает, чтобы присвоение ShortString представило в виде строки?

Я преобразовываю некоторый унаследованный код в Delphi 2010.

Существует достаточное количество старого ShortStrings, как строка [25]

Почему делает уроки ниже:

type 
  S: String;
  ShortS: String[25];

...
S := ShortS;

заставьте компилятор генерировать это предупреждение:

W1057 Implicit string cast from 'ShortString' to 'string'.

Нет никакой потери данных, которая происходит здесь. При каких обстоятельствах это предупреждение было бы полезной информацией мне?

Спасибо!

Tomw

20
задан Rob Kennedy 23 January 2010 в 05:57
поделиться

4 ответа

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

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

15
ответ дан 30 November 2019 в 00:01
поделиться

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

Чтобы заставить его уйти, использовать явную преобразование преобразования:

S := string(ShortS);
18
ответ дан 30 November 2019 в 00:01
поделиться

Я не знаю, что Delphi, но если я правильно помню, ночими По сути, последовательность символов на стеке, в то время как обычная строка (ансистрация) на самом деле является ссылкой на местоположение на куче. Это может иметь разные последствия.

Вот хорошая статья о различных типах строк: http://www.codexterity.com/delphistrings.htm

Я думаю, что может также быть разница в условиях кодирования, но я уверен, что я не на 100%.

-4
ответ дан 30 November 2019 в 00:01
поделиться

Предупреждение очень важно, потому что вы можете потерять данные. Преобразование выполняется с использованием текущего набора символов Windows 8-бит, а некоторые наборы символов не определяют все значения от 0 до 255, либо являются многобайтовыми символами, и, таким образом, не могут преобразовать все значения байтов.

Потеря данных может возникать на стандартном компьютере в стране со специфическими стандартными наборами символов или на компьютере в США, которые были настроены для другой локали, потому что пользователь много связывает с людьми на других языках.

Например, если локальная кодовая страница составляет 932, значения байтов 129 и 130 будут преобразовывать одно и то же значение в строке Unicode.

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

7
ответ дан 30 November 2019 в 00:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: