11

私の理解 (これは間違っているかもしれません) では、C# で文字列を作成すると、文字列は「インターン プール」にインターンされます。複数の同じ文字列がオペレーティングメモリを共有できるように、文字列への参照を保持します。

ただし、一意である可能性が非常に高い多くの文字列を処理しており、それぞれの処理が完了したらオペレーティング メモリから完全に削除する必要があり、キャッシュされた参照を削除してガベージ コレクターを削除する方法がわかりません。すべての文字列データをメモリから削除できます。文字列がこのキャッシュにインターンされないようにするにはどうすればよいですか、または文字列をクリア/削除して、オペレーティングメモリから確実に削除するにはどうすればよいですか?

4

4 に答える 4

7

セキュリティ上の理由で文字列をメモリから削除する必要がある場合は、SecureString.

それ以外の場合、文字列への参照がどこにもない場合でも、GC はそれをクリーンアップします (インターンされなくなります) ので、インターンについて心配する必要はありません。

そしてもちろん、最初にインターンされるのは文字列リテラルのみです (または、Petr や他の人が上で述べたように String.Intern() を呼び出す場合)。

于 2013-04-26T09:46:33.533 に答える
5

次のように、アセンブリ全体に属性を適用CompilationRelaxationsします (唯一可能な解決策は、アセンブリ レベルでインターンを禁止することです)。

[assembly: CompilationRelaxations(CompilationRelaxations.NoStringInterning)]

CompilationRelaxationsの詳細

アップデート:

ドキュメントには、属性が次のように記載されています。

文字列リテラルのインターンを必要としないアセンブリをマークします。

言い換えれば、コンパイラが文字列のインターンを行うことを妨げるものではなく、それが必要ないというヒントを提供するだけです。この分野のドキュメントは少しまばらですが、これは MSDN フォーラムの投稿の結論でもあるようです。

その属性に関するこのSOの質問から

于 2013-04-26T09:46:46.237 に答える
1

インターンを防止しようとする前に、String.IsInterned() を使用して、関心のある文字列が実際にインターンされているかどうかを確認することをお勧めします。その関数が null を返す場合、文字列はインターンされません。

私の知る限り、実行時に動的に生成される文字列はまったくインターンされません。パフォーマンス上の利点がないためです。

于 2013-04-26T09:55:03.470 に答える