Является ли WideString идентичным String в Delphi 2009

Я получаю какое-то странное поведение, перекомпилирующее некоторые приложения в 2009 году, которые использовали самые широкие точки в разных точках.

В приложении Delphi 2009 приложение Widestring идентично String?

Ответы

Ответ 1

Нет, они не являются idenitical.

WideString - это просто оболочка для типа ActiveX/COM BSTR. Это необходимо при работе со строками в ActiveX/COM.

String в Delphi 2009 и позже является псевдонимом для UnicodeString, который может содержать символы Юникода, как это делает BSTR, но это НЕ то же самое, что и WideString. WideString выделяется диспетчером памяти COM и не подсчитывается ссылка. UnicodeString выделяется диспетчером памяти RTL и подсчитывается по ссылке, точно так же, как AnsiString.

Вы можете использовать (Unicode)String везде, где это возможно, и использовать только WideString для COM-взаимодействия или иметь дело с устаревшими библиотеками, которые используют WideString для поддержки Unicode.

Ответ 2

Кажется, ответ здесь:

Наиболее драматичным изменением в Delphi 2009 является то, что тип "string" теперь является псевдонимом UnicodeString вместо AnsiString.

Ответ 3

Еще одно важное замечание - разница в производительности.

В Marco Cantu White Paper (упоминается в ответе moodforaday) говорится:

"WideString была (и до сих пор) не подсчитана ссылкой и крайне плоха с точки зрения производительности и гибкости (например, она использует глобальный распределитель памяти Windows, а не собственный FastMM4).

Почти каждое руководство по обновлению для Delphi 2009, которое я видел, рекомендует вам конвертировать все WideStrings в Strings.

Ответ 4

См. эту статью Марко Канту, которая описывает работу строки (например, UnicodeString) в Delphi 2009:

"Белая книга: Дельфы и Юникод"

http://dn.codegear.com/article/38980

В принципе, это то, что сказал Родди, но занимает 27 страниц, чтобы подробно остановиться.