1

私はこの他のSOの質問に答えを投稿するつもりでしたが、とにかく、誰かがStringBuilderクラスで私の前に出て行きました...

StringBuilder Class.NETの文字列は不変であることを理解しています。したがって、文字列を作成して変更すると、内部バッファを維持し、呼び出し時にのみ最終文字列を作成するのとは対照的に、実際にはメモリ内に2つの異なる文字列が作成されToString()ます。また、.NETが各文字列をインターンすることも知っているので、アプリケーションで使用される文字列ごとにコピーのみが作成されます。

文字列を別の文字列に追加すると、両方ともアプリケーションで使用されているため、両方がインターンされます(そうではありませんか?)。連結演算子を使用して文字列を追加しない主な理由は、最終的に完了すると、メモリ内の文字列の束全体が、それぞれ以前よりも大きくなります。

01234と連結する56789と、メモリに次の2つの文字列が作成されることを理解しています。

01234
0123456789

StringBuilderインターンのために、意志のみを使用している間:

01234
56789

明らかに2番目のアプローチはパフォーマンスに優れていますが、実際にはどれくらい優れていますか?StringBuilderつまり、小さな値のリストからより大きな文字列を作成している場合、なぜ(それ自体がメモリスペースを必要とする)を考慮する必要があるのでしょうか。いつも使うのはいいですか?または、いつ使用するか[使用しない]かについての経験則はありますか?

4

1 に答える 1

3

また、.NETが各文字列をインターンすることも知っています

いいえ、あなたはインターンについて間違った考えを持っていました。たとえば、連結によって新しい文字列を作成すると、ランタイムはインターンされた文字列のテーブルを調べて、一致する可能性があるかどうかを確認しませんこれは非常に非効率的であり、GC ヒープ スペースをわずかに節約するには CPU サイクルが多すぎます。

通常の .NET アプリでインターンされる唯一の文字列は、最初からインターンとして開始されたものです。コンパイラがソース コードのリテラルから作成し、アセンブリ メタデータの文字列テーブルに追加したもの。String.Intern() メソッドを使用して明示的に文字列をインターンできますが、これは非常にまれなことです。

StringBuilder を使用して、寿命が非常に短い一時的な文字列を大量に生成しないようにします。

于 2012-04-24T01:33:25.140 に答える