Есть ли преимущество в использовании resourcestring вместо строки const?
Не могли бы вы сказать мне, есть ли какое-то преимущество (меньше места для хранения, увеличения скорости и т.д.) при использовании:
resourcestring
MsgErrInvalidInputRange = 'Invalid Message Here!';
вместо
const
MsgErrInvalidInputRange : String = 'Invalid Message Here!';
Ответы
Ответ 1
Опция const будет быстрее, чем resourcestring, потому что позже вызывается Windows API для получения текста ресурса.
Вы можете сделать это быстрее, используя некоторый механизм кеширования. Это то, что мы делаем в расширенном RTF Delphi.
И это хорошая идея, чтобы сначала загрузить resourcestring в строку, если вам придется много раз обращаться к ресурсу resourcestring.
Основная задача resourcestring - разрешить i18n (интернационализация) вашей программы.
У вас есть Менеджер переводов с некоторыми версиями среды разработки Delphi. Но он зависит от внешних DLL.
Вы можете использовать систему gettext, исходящую из мира Linux, из http://dxgettext.po.dk, которая зависит от внешних файлов .po.
Мы включили наш собственный механизм i18n в нашу структуру, который переводит и кэширует текст resourcestring и использует внешние .txt файлы (вы можете использовать текстовые файлы UTF-8 или Unicode, от Delphi 6 до XE). Кэширование делает это так же быстро, как использование константы. См. http://synopse.info/fossil/finfo?name=SQLite3/SQLite3i18n.pas
Существуют другие решения с открытым исходным кодом или коммерческие решения.
О хранении размера, resourcestring хранятся как буферы UC2. Таким образом, resourcestring будет использовать больше памяти, чем строка до Delphi 2009. Поскольку Delphi 2009, все строки являются unicodestring, то есть UCS2, поэтому у вас не будет больше размера хранилища. Во всех случаях размер хранилища для текста не является большим параметром размера для приложения (растровые изображения и размер кода имеют гораздо больший эффект для конечного exe).
Ответ 2
Строки ресурсов хранятся как записи STRINGTABLE в вашем ресурсе exe, константы хранятся как часть сегмента фиксированных данных. Поскольку они являются частью раздела ресурсов, вы можете извлечь их и DFM, перевести их и сохранить в модуле ресурсов (только для данных DLL). Когда приложение Delphi запускается, он ищет эту DLL и будет использовать строки из него вместо тех, которые включены в ваш EXE, для загрузки переводов.
Документация Embarcadero docwiki охватывает Менеджер переводов, но многие другие инструменты перевода Delphi также используют строки ресурсов.
Ответ 3
Как уже упоминалось, строки resourcestring будут включены в отдельный ресурс в вашем exe и, как таковые, имеют преимущества, когда вам нужно обслуживать несколько языков в пользовательском интерфейсе вашего приложения.
Как уже упоминалось, константные строки включены в раздел данных вашего приложения.
До D2007
В версиях Delphi до D2007 константные строки были сохранены как строки Ansi, требующие одного байта на символ, тогда как строки ресурсов будут храниться в UTF-16: кодировка по умолчанию Windows (хотя, возможно, не для Win9x). IIRC D2007 и предыдущие версии не поддерживали кодированные файлы UTF-8. Таким образом, любые строки, закодированные в ваших источниках, должны поддерживаться кодами ANSI, и, как следствие, они не выходят за рамки многоязычной плоскости Unicode. Это означает, что будет использоваться только UCS-2 часть UTF-16, и все строки могут храниться в двух байтах на символ.
Вкратце: до строк константы D2007 принимают один байт на символ, строки ресурсов берут два байта на символ.
D2009 и
Delphi был включен в Unicode в версии D2009. С тех пор все немного по-другому. Строки Resourcestring сохраняются как UTF-16. Никакой другой вариант здесь, поскольку они "управляются" Windows.
Строки Consts - это совсем другая история. Поскольку D2009 Delphi хранит несколько версий каждой строки const в вашем exe. Каждая версия в другой кодировке. Константу можно сохранить как строки Ansi, строки UTF-8 и строки UTF-16.
Какое из этих кодировок сохраняется, зависит от использования константы. По умолчанию будет использоваться UTf-16, поскольку это стандартная внутренняя кодировка Delphi. Назначьте ту же константу "нормальной" (UTF-16) строке, а также переменной AnsiString, а константа будет сохранена в exe как UTF-16, так и Ansi...
De-озвучивание
По внешнему виду (экспериментируя с D5 и D2009) Delphi "де-dupes" const строками, тогда как это не делает этого для строк resourcestring.
Ответ 4
С помощью resourcestring компилятор помещает эти строки в качестве ресурса stringtable в исполняемый файл, позволяя кому-либо (например, вашей команде перевода) редактировать их с помощью редактора ресурсов без необходимости перекомпилировать приложение или иметь доступ к исходному коду.
Ответ 5
Также есть третий вариант:
Const MsgErrInvalidInputRange = 'Неверное сообщение здесь!';
Последний может быть более функциональным, потому что компилятор не выделяет пространство в сегменте данных, он может помещать строку в сегмент кода. Также помните, что то, что может быть сделано с типизированными константами, зависит от директивы $WRITEABLECONST, хотя я не знаю, что именно компилятор, когда он включен или выключен.