'+'演算子を使用した文字列の連結


86

見るとstring、クラスのメタデータは、私が唯一の演算子を参照==して!=、オーバーロード。では、 ' +'演算子の連結をどのように実行できるのでしょうか。

編集

文字列の連結に関するEricLippertからの興味深いメモ:

パート1

パート2

パート2で参照されているJoelのスーパー記事もありますhttp://www.joelonsoftware.com/articles/fog0000000319.html)。

回答:


143

そうではありません-C#コンパイラはそうします:)

したがって、このコード:

string x = "hello";
string y = "there";
string z = "chaps";
string all = x + y + z;

実際には次のようにコンパイルされます:

string x = "hello";
string y = "there";
string z = "chaps";
string all = string.Concat(x, y, z);

(Gah-途中の編集で他のビットが誤って削除されました。)

複数の文字列の連結がここにあることをC#コンパイラ気づかの利点は、あなたが中間の文字列の作成を終了していないということですx + y、その後の連結の一部として再度コピーする必要がある(x + y)としz。代わりに、すべてを一度に実行します。

編集:ループで連結すると、コンパイラーは何もできないことに注意してください。たとえば、次のコードは次のとおりです。

string x = "";
foreach (string y in strings)
{
    x += y;
}

最終的には次と同等になります。

string x = "";
foreach (string y in strings)
{
    x = string.Concat(x, y);
}

...だから、これたくさんのゴミを生成します、そしてそれはあなたがStringBuilderそのような場合に使うべきである理由です。うまくいけばさらなる質問に答えるであろう2つの詳細についての記事があります


8
いい答えだ; 単なるフォローアップの質問:ループ内で文字列を連結している場合、ループ内で何が行われるかを事前に知ることができない場合、コンパイラは.Concat演算子をどのように機能させますか。
フレンチブルドッグ2012

ああ、大丈夫!そのため、連結にはStringBuilderを使用する方がよいのでしょうか。
フレンチブルドッグ2012

4
@frenchie:だからこそ、繰り返し連結するにはStringBuilderを使用する方がよいのですが、固定数の値を連結する価値がないのはなぜですか。
ジョンスキート2012

@ Jon-Skeet:迅速な説明に感謝します...私もILをチェックインする必要がありました..これはintも追加する方法ですか?Addメソッドを呼び出すことによって?
NoviceProgrammer 2012

2
ただし、最近ではstring.Concatstring.Joinメソッドに多くのオーバーロードがあり、IEnumerable<>インスタンスを取り込むものもあることに注意してください。したがって、ほとんどの場合、を使用するよりも使用する方が便利StringBuilderです(これらのメソッドがStringBuilder内部で使用するかどうかはわかりませんが、ほとんどの場合、より便利だと言っています)。
Jeppe Stig Nielsen 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.