見るとstring
、クラスのメタデータは、私が唯一の演算子を参照==
して!=
、オーバーロード。では、 ' +
'演算子の連結をどのように実行できるのでしょうか。
編集:
文字列の連結に関するEricLippertからの興味深いメモ:
パート2で参照されているJoelのスーパー記事もあります(http://www.joelonsoftware.com/articles/fog0000000319.html)。
見るとstring
、クラスのメタデータは、私が唯一の演算子を参照==
して!=
、オーバーロード。では、 ' +
'演算子の連結をどのように実行できるのでしょうか。
編集:
文字列の連結に関するEricLippertからの興味深いメモ:
パート2で参照されているJoelのスーパー記事もあります(http://www.joelonsoftware.com/articles/fog0000000319.html)。
回答:
そうではありません-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つの詳細についての記事があります。
string.Concat
、string.Join
メソッドに多くのオーバーロードがあり、IEnumerable<>
インスタンスを取り込むものもあることに注意してください。したがって、ほとんどの場合、を使用するよりも使用する方が便利StringBuilder
です(これらのメソッドがStringBuilder
内部で使用するかどうかはわかりませんが、ほとんどの場合、より便利だと言っています)。