6

理解できない :

MSDNによると

http://msdn.microsoft.com/en-us/library/system.string.intern.aspx

したがって、特定の値を持つリテラル文字列のインスタンスは、システムに1回だけ存在します。

たとえば、同じリテラル文字列を複数の変数に割り当てると、ランタイムはインターンプールからリテラル文字列への同じ参照を取得し、それを各変数に割り当てます。

この動作はデフォルト(インターンなし)ですか?またはインターンメソッドを使用して?

  • デフォルトの場合、なぜインターンを使用したいのですか?(インスタンスはすでに一度になります...)?

  • デフォルトではない場合:この行を1000回書き込んだ場合:

    Console.WriteLine( "lalala");

1)メモリ内で「lalala」が1000回発生しますか?(インターンを使わずに...)

2)「ラララ」は最終的にGcされますか?

3)「ラララ」はすでに収容されていますか?もしそうなら、なぜ私はプールからそれを「取得」する必要があり、単に「lalala」をもう一度書くのではないのですか?

少し混乱しています。

4

2 に答える 2

11

文字列リテラルは自動的にインターンされます(したがって、コードに「lalala」が1000回含まれている場合、インスタンスは1つだけ存在します)。

このような文字列はGCされません。参照されるたびに、参照はインターンされた文字列になります。


string.Internリテラルではない文字列(たとえば、ユーザー入力から、またはファイルやデータベースから読み取ったもの)があり、非常に頻繁に繰り返されることがわかっているため、プロセスの存続期間中はインターンする価値があります。

于 2012-01-01T07:54:59.223 に答える
5

インターンは舞台裏で行われるものなので、プログラマーとしてのあなたはそれについて心配する必要はありません。通常、プールに何かを入れたり、プールから何かを取得したりする必要はありません。ガベージコレクションのように、それを呼び出す必要はなく、発生する可能性があることを心配したり、発生しない可能性があることを心配したりする必要はありません。(まあ、99.999%のケースで。残りの0.001%は、非常に奇妙なことをしているときです。)

コンパイラは、ソースファイルに含まれるすべての文字列リテラルのインターンを処理するため、「lalala」は、何もしなくても、または問題を制御することなく、インターンされます。また、プログラムで「lalala」を参照するときはいつでも、コンパイラーは、何もしなくても、問題を制御することなく、インターンプールからそれをフェッチするようにします。

インターンプールには、多かれ少なかれ固定数の文字列が含まれており、通常は非常に小さいサイズ(.exeの合計サイズのほんの一部)であるため、ガベージコレクションが行われないことは問題ではありません。


編集

文字列をインターンする目的は、Equals()などの特定の文字列操作の実行時間を大幅に改善することです。最初に文字列が参照によって等しいかどうかをチェックするEquals()方法は、非常に高速です。String参照が等しい場合は、trueすぐに戻ります。参照が等しくなく、文字列が両方ともインターンされているfalse場合、インターンプール内のすべての文字列が互いに異なるため、それらが等しくなる可能性はないため、すぐに返されます。上記のいずれにも当てはまらない場合は、文字列ごとの比較が続行されます。(実際には、文字列のハッシュコードもチェックするため、それよりもさらに複雑ですが、この説明では単純にしましょう。)

したがって、文字列内のファイルからトークンを読み取っsていて、次の形式のswitchステートメントがあるとします。

switch( s )
{
    case "cat": ....
    case "dog": ....
    case "tod": ....
}

文字列リテラル「cat」、「dog」、「tod」はすべてインターンされていますが、sインターンされていない、と比較しているため、インターンプールのメリットを享受していません。sswitchステートメントの直前でインターンを行うと、switchステートメントによって実行される比較がはるかに高速になります。

もちろん、ファイルにガベージが含まれている可能性がある場合は、これを実行しないでください。インターンプールにランダムな文字列を大量にロードすると、プログラムのパフォーマンスが低下し、最終的にメモリが不足するためです。 。

于 2012-01-01T08:25:07.613 に答える