【C#】文字列のインターン化

C言語では文字列の実態はchar型の配列だが、C#の場合は文字列型のオブジェクトである。

文字列型(string)は参照型である。

文字列は不変であり、一度作成した文字列は変更できない。string型変数の内容を変更する場合は毎回新しいインスタンスが作られる

参照されなくなった文字列はガベージとなり、ガベージコレクションで回収される。

同じ文字列でも毎回インスタンスを生成すると、ガベージが増えてしまう。そのため、以前作られた文字列と同じ文字列である場合、インターンプールにより同一のインスタンスが利用される。(同じ参照になる)

インターンプールとは生成した文字列を格納しておく場所で、あとから文字列を生成する際、インターンプールに同じ文字列が存在していればそれを取得し、新たなインスタンスは生成しない。

インターンプールに登録されるかどうかは基準がある。例えば、リテラルは自動的に登録されるが、StringBuilderで生成した文字列は登録されない。

明示的にインターンプールに登録する

String.Internを使用すると、明示的にインターンプールに登録することができる。既に登録されている場合は何もしない。

参考サイト: 2019-12-16 (C#) string で発生するガベージを抑える (String Interning)2/16/195847

コメント

タイトルとURLをコピーしました