16

このトピックに関する次の質問を認識しています。

  1. リソース (.resx) ファイルに関するパフォーマンスの問題や警告はありますか?

  2. 文字列リソース (.resx) のプロパティはメモリに保持されますか?

ら。ただし、これらの質問に対する回答はどれも満足のいくものではありません (十分に具体的ではありません)。

このトピックに関するMSDNのページも知っていますが、リソース ファイルを使用する際のオーバーヘッドに関する技術情報が不足しているようです。


私の苦境は、かなり大きなサイズの WinForms アプリケーションのローカライズに着手しようとしているということです。この段階での私の懸念は、たとえば、ネストされたループ内から .​​resx ファイルからリソースにアクセスするパフォーマンスについてです。現在、ローカライズしたコードのごく一部 (列名、行ヘッダーなどDataGridView) について、関連するクラスのグローバル変数にリソースをキャッシュし、それらを使用しています。

.resx のリソースはどのようにアクセスされますか (コンパイル時にアセンブリに含まれますか?)、それらのリソースをキャッシュし、アクセスにグローバル変数を使用することでパフォーマンス上の利点はありますか?

4

1 に答える 1

19

文字列リソースはメモリにキャッシュされます。で生成されたコードを見てください"Resources.Designer.cs"

を使用し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 に答える