2012-02-01 34 views
4

SubString()メソッドを使用して文字列を作成した場合、結果の文字列は元の文字列の要素のコピーになります(同じ情報を持つ2つのメモリ位置が存在する)か、または既存のメモリ位置?String.Substring():コピーまたは参照?

コピーであれば、代わりに参考にする方法はありますか?

答えて

5

C#の文字列では、は不変 *ですが、は永続的ではありませんです。つまり、SubStringメソッドの結果である新しい文字列は、古い文字列と共通の部分を共有していません。 HereはEric Lippertの美しい説明です。

*文字列を操作すると新しい文字列オブジェクトが返されます

5

これはコピーで、stringを別の文字列の一部とすることはできません。 .net文字列は配列によってサポートされておらず、charデータのインラインを含んでいます。すなわち、それは配列に類似した可変長クラスである。

サブリファレンスモデルは実装可能ですが(私はJava文字列がchar配列のスライスにすぎないと考えています)、小さな部分文字列を維持することで文字列全体がメモリ内に保持されるという奇妙な動作につながりますjavaサブストリング。私は.netデザイナーがこのような問題を避けたかったと思う。

このプロパティを持つ独自の文字列型を使用できます。たとえば、スライスを文字配列ArraySegment<char>で処理することができます。

0

新しい文字列です。あなたは、他の文字列の開始位置と終了位置を保持しているものをノックすることができます。たとえば、呼び出すと、部分文字列に送る引数です。 固定パターンの場合(または少なくとも既知の間隔で固定することができる場合は、事前に切り刻むか、StringBuilderまたはStreamをTextReaderで使用することができます)

部分文字列が問題になる不変の文字列を持つ言語では、その必要性を設計する必要があります。それは便利ですが、それは一度オフにする必要があります。