12

メモリに長期間保持される重複文字列が多数発生する状況があります。使用したいString.Internのですが、プロジェクトがライブラリであるため、潜在的なアプリケーション リソースに侵入したくありません。これはどのように作動しますか?

4

1 に答える 1

13

文字列のインターン テーブルはCLR スコープです。

まず、インターンされた String オブジェクトに割り当てられたメモリは、共通言語ランタイム (CLR) が終了するまで解放されない可能性があります。その理由は、インターンされた String オブジェクトへの CLR の参照が、アプリケーションまたはアプリケーション ドメインが終了した後も保持される可能性があるためです。

したがって、インターン テーブルはアセンブリ固有ではないだけでなく、アセンブリよりも長く存続する可能性があります。良いニュースは、一度インターンされた同じ参照を持つ同じリテラル文字列が存在するため、重複した文字列は問題にならないということです。したがって、Interningが推奨されます:

共通言語ランタイムは、インターン プールと呼ばれるテーブルを維持することにより、文字列ストレージを節約します。このテーブルには、プログラムでプログラムによって宣言または作成された一意の各リテラル文字列への単一の参照が含まれています。したがって、特定の値を持つリテラル文字列のインスタンスは、システム内に 1 回だけ存在します。

string s1 = "MyTest"; 
string s2 = new StringBuilder().Append("My").Append("Test").ToString(); 
string s3 = String.Intern(s2); 
Console.WriteLine((Object)s2==(Object)s1); // Different references.
Console.WriteLine((Object)s3==(Object)s1); // The same reference.
于 2014-10-24T09:05:08.317 に答える