16

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

  1. 资源 (.resx) 文件是否存在任何性能问题或警告?

  2. 字符串资源 (.resx) 属性是否保存在内存中?

等。但是,我在这些问题中没有找到任何令人满意的答案(它们不够具体)。

我也知道有关此主题的MSDN页面,但这些似乎也忽略了有关使用资源文件的开销的技术信息。


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

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

4

1 回答 1

19

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

它使用 a System.Resources.ResourceManager,这会缓存字符串。

还要注意这个 ResourceManager 构造函数。它提到您可以更改缓存策略:

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

(我的重点)

文档ResourceSet明确说:

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

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

[编辑] 既然你似乎不相信我!:)

(1) 查看构造函数ResourceManager(string baseName,Assembly assembly)的文档。它指出:

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

(2) 现在查看ResourceSet 的文档。它指出:

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

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

于 2013-03-20T10:54:29.473 回答