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

时间:2013-03-20 10:39:26

标签: c# winforms resources resx

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

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

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

  3. 等。但是,我没有发现这些问题中的任何答案都令人满意(它们不够具体)。

    我也知道关于这个主题的MSDN页面,但是这些页面似乎也在关于使用资源文件的开销的技术信息上吝啬。


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

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

1 个答案:

答案 0 :(得分:17)

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

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

另请注意this ResourceManager constructor。它提到你可以改变缓存策略:

  

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

(我的重点)

documentation for ResourceSet明确说:

  
    

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

  

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

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

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

  
    

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

  

(2)现在看看documentation for ResourceSet。它声明:

  
    

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

  

因此,MSDN中确实记录了这种缓存行为,另外您可以通过使用Resharper检查实现来验证这是发生了什么。