4

String.Trim()頻繁ではありませんが、文字列の空白を削除するために使用する必要がある場合があります。
最後のトリムコーディングから時間がかかった場合は、次のように記述します。

string s = " text ";
s.Trim();

なぜsが変更されないのか驚いています。私は書く必要があります:

string s = " text ";
s = s.Trim();

なぜですかいくつかのこの(あまり直感的ではない)方法で設計された文字列メソッド?文字列に何か特別なものはありますか?

4

4 に答える 4

23

文字列は不変です。文字列操作は、元の文字列を変更せずに新しい文字列を生成します。

MSDNから:

文字列は不変です。文字列オブジェクトの内容は、オブジェクトの作成後に変更することはできませんが、構文上は変更できるように見えます。

于 2012-04-17T12:00:14.700 に答える
7

s.Trim()元の文字列の新しいトリミングされたバージョンを作成し、新しいバージョンをに格納する代わりにそれを返しますs。したがって、あなたがしなければならないことは、トリミングされたインスタンスを変数に格納することです。

  s = s.Trim();

このパターンは、すべての文字列メソッドと拡張メソッドで使用されます。

文字列が不変であるという事実は、このパターンを使用するという決定とは関係ありませんが、文字列がメモリにどのように保持されるかという事実と関係があります。このメソッドは、メモリ内に新しい変更された文字列インスタンスを作成し、変数が新しいインスタンスを指すように設計されている可能性があります。

StringBuilder文字列に多くの変更を加える必要がある場合は、「可変」文字列のように動作するを使用する方がはるかに優れており、この種の操作を実行する方がはるかに効率的であることも覚えておいてください。

于 2012-04-17T12:11:47.627 に答える
2

MSDNライブラリに書かれているように:

Stringオブジェクトは、作成後に値を変更できないため、不変(読み取り専用)と呼ばれます。Stringオブジェクトを変更しているように見えるメソッドは、実際には変更を含む新しいStringオブジェクトを返します。

文字列は不変であるため、単一の文字列のように見えるものに繰り返し追加または削除を実行する文字列操作ルーチンは、パフォーマンスを大幅に低下させる可能性があります。

このリンクを参照してください。

于 2012-04-17T12:04:11.887 に答える
1

すべての良い答えに加えて、私はまた、その理由がThreadsafteyであると感じています。

まあ言ってみれば

string s = " any text "; s.Trim();

あなたがこれを言うとき、他のスレッドがsを変更するのを止めるものは何もありません。同じ文字列が変更された場合、たとえば他のスレッドがsから'a'を削除した場合、s.Trim()の結果はどうなりますか?

ただし、新しい文字列を返す場合、他のスレッドによって変更されていてもtrim、ローカルコピーで変更して、変更された文字列を返すことができます。

于 2012-04-17T12:59:35.373 に答える