クラス内でconstとして宣言する代わりに、リソースファイルで文字列定数を定義する場合、ヒープメモリフットプリントの点で利点はありますか?
3 に答える
確かなことはわかりませんが、const
文字列の割り当てが異なるようです。特に、ガベージ コレクションの対象にはなりません。そのため、リソースから文字列をロードするよりも、関連するオーバーヘッドが少ない可能性があります。ただし、その差は非常に小さい可能性があります。膨大な数の文字列がない限り、ヒープ メモリ使用量の違いに気付くことはありません。
const
決して変わらないものに使用されます。リソース文字列は、変更される可能性が高いもの用です。どちらを使用するかは、どちらがヒープ上でより多くのスペースを占めるかではなく、それに基づいて決定する必要があります。
string interningについて読んだことがありますか? .NET は、文字列がメモリ内に 1 回だけ存在するように (場合によっては永遠に)、文字列のキャッシュを保持します。定数文字列はインターンされます。動的に (つまり、StringBuilder で) 構築された文字列はインターンされません。
この質問への回答によると、リソース ファイル内の文字列はインターンされません。これが当てはまり、リソースに大きな重複文字列を含む多くのリソース ファイルをロードすると、メモリ内に多数の文字列が重複する可能性があります。
私の知る限り、文字列リテラルはインターンされているため(String.Intern)、使用時に重複や余分な割り当てはありません。デフォルトでは、リソース文字列が同じように動作するとは思いません。
これが懸念される場合は、リソースから文字列を読み取ってインターンする独自のコードを作成し、ケースにとって有益かどうかを確認できます。
補足: リソースからの定数文字列と文字列は、通常、非常に異なる目的で使用されます (1 つは静的なカルチャの不変値、もう 1 つはローカライズ可能で、異なるカルチャでは異なることが予想されます)。ローカライズ可能な文字列をコード内の定数に移行する十分な理由があるはずです。