Подтвердить что ты не робот

Эксплуатационные накладные расходы при использовании файлов ресурсов (.resx)

Примечание. Я знаю следующие вопросы по этой теме:

et al. Тем не менее, я не нахожу ответы на эти вопросы удовлетворительными (они недостаточно конкретны).

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


Мое затруднение заключается в том, что мы собираемся начать локализацию приложения с большим размером WinForms. На этом этапе моя озабоченность связана с производительностью доступа к ресурсам из файла .resx, например, из вложенного цикла. В настоящее время для небольшой части кода мы локализованы (имена столбцов, заголовки строк и т.д. Для DataGridView и т.д.), Мы обналичиваем ресурсы в глобальных переменных соответствующего класса и используем их.

Как используются ресурсы из .resx(они включены в сборку во время компиляции?) и есть ли преимущество в производительности от обналички этих ресурсов и использования глобальных переменных для доступа?

4b9b3361

Ответ 1

Ресурсы строк кэшируются в памяти. Посмотрите на код, сгенерированный в "Resources.Designer.cs".

Он использует System.Resources.ResourceManager, и это делает кеширование строк.

Также обратите внимание на этот конструктор ResourceManager. В нем упоминается, что вы можете изменить стратегию кеширования:

Этот конструктор использует системную реализацию ResourceSet. Чтобы использовать формат файла пользовательского ресурса, вы должны получить Класс ResourceSet, переопределить GetDefaultReader и GetDefaultWriter методы и передать этот тип в ResourceManager (String, Assembly, Тип). Использование настраиваемого ResourceSet может быть полезным для управление политикой кэширования ресурсов или поддержка вашего собственного ресурса формат файла, но, как правило, не требуется.

(мой акцент)

Документация для ResourceSet явно говорит:

Класс ResourceSet перечисляет в IResourceReader, загружая каждое имя и значение и сохраняя их в Hashtable

Итак, мы знаем точную стратегию кэширования, которую вы получите по умолчанию.

[EDIT] Поскольку вы, кажется, не верите мне!:)

(1) Посмотрите документацию для конструктора ResourceManager (string baseName, Assembly assembly). В нем указано:

Этот конструктор использует системную реализацию ResourceSet.

(2) Теперь просмотрите документацию для ResourceSet. В нем указано:

Класс ResourceSet перечисляет над IResourceReader, загружая каждое имя и значение и сохраняя их в Hashtable.

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