使用资源文件 (.resx) 时的性能开销

2024-02-02

请注意,我知道有关此主题的以下问题:

  1. 资源 (.resx) 文件是否存在任何性能问题或警告? https://stackoverflow.com/questions/1278171/are-there-any-performance-issues-or-caveats-with-resource-resx-files

  2. 字符串资源 (.resx) 属性是否保存在内存中? https://stackoverflow.com/questions/9503887/are-string-resources-resx-properties-kept-in-memory

等人。然而,我发现这些问题的答案都不令人满意(不够具体)。

我也知道MSDN http://msdn.microsoft.com/en-us/library/1021kkz0(v=vs.71).aspx有关此主题的页面,但这些似乎也忽略了有关使用资源文件的开销的技术信息。


我的困境是,我们即将开始本地化一个相当大的 WinForms 应用程序。例如,我在此阶段关注的是从嵌套循环内的 .resx 文件访问资源的性能。目前,我们已经本地化了一小部分代码(列名、行标题等)DataGridView等)我们正在兑现相关类的全局变量中的资源并使用它们。

如何访问 .resx 中的资源(它们是否在编译时包含在程序集中?)以及兑现这些资源并使用全局变量进行访问是否会带来性能优势?


字符串资源缓存在内存中。查看生成的代码"Resources.Designer.cs".

它使用一个System.Resources.ResourceManager http://msdn.microsoft.com/en-gb/library/system.resources.resourcemanager.aspx,这会缓存字符串。

另请注意这个 ResourceManager 构造函数 http://msdn.microsoft.com/en-us/library/yfsz7ac5.aspx。它提到您可以更改缓存策略:

此构造函数使用系统提供的 ResourceSet 实现。 要使用自定义资源文件格式,您应该从 ResourceSet类,重写GetDefaultReader和GetDefaultWriter 方法,并将该类型传递给 ResourceManager(String, Assembly, 类型)构造函数。使用自定义资源集可以对...有用 控制资源缓存策略或支持您自己的资源 文件格式,但通常没有必要。

(我的重点)

The 的文档ResourceSet http://msdn.microsoft.com/en-us/library/system.resources.resourceset.aspx明确地说:

ResourceSet 类枚举 IResourceReader,加载每个名称和值,并将它们存储在 Hashtable 中

所以我们确实知道默认情况下您将获得的确切缓存策略。

[编辑] 因为你似乎不相信我! :)

(1)查看构造函数的文档ResourceManager(字符串基本名称,Assembly程序集) http://msdn.microsoft.com/en-us/library/yfsz7ac5.aspx。它指出:

此构造函数使用系统提供的 ResourceSet 实现。

(2) 现在看资源集文档 http://msdn.microsoft.com/en-us/library/system.resources.resourceset.aspx。它指出:

ResourceSet 类枚举 IResourceReader,加载每个名称和值,并将它们存储在哈希表中。

因此,这种缓存行为确实记录在 MSDN 中,此外,您可以通过使用 Resharper 检查实现来验证这是否是正在发生的情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用资源文件 (.resx) 时的性能开销 的相关文章

随机推荐