2013-03-20 4 views
11

Примечание, я знаю следующие вопросы по этой теме:Накладные производительности при использовании ресурсов файлов (.resx)

  1. Are there any performance issues or caveats with resource (.resx) files?

  2. Are string resources (.resx) properties kept in memory?

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

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


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

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

ответ

14

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

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

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

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

(курсив мой)

documentation for ResourceSet прямо говорит:

класс

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

Значит, мы точно знаем, что такое кеширование который вы получите по умолчанию.

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

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

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

(2) Теперь посмотрим на documentation for ResourceSet. Она гласит:

класс

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

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

+0

+1 Большое спасибо за ваш ответ. Самое ценное. Можете ли вы объяснить мне еще одну вещь. Чтобы вызвать ресурс из документов [MSDN docs] (http://msdn.microsoft.com/en-us/library/yfsz7ac5.aspx), мы делаем ResourceManager rm = new ResourceManager («ExampleResources», typeof (Example) .Сборка); string greeting = rm.GetString («Приветствие»); но я понимаю из http://stackoverflow.com/a/1142840/626442, что это также можно сделать с помощью Console.WriteLine (string.Hello); файл ресурсов - 'strings.resx'. В чем разница? – MoonKnight

+0

Вы можете помочь с этим вопросом: http://stackoverflow.com/questions/15523604/error-in-generation-of-resource-resource-design-cs-file – MoonKnight

+1

Использование 'strings.Hello' просто использует автоматически- сгенерированный класс в 'Resources.Designer.cs' –

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