C#でstringをappendする方法|文字列結合とStringBuilderの使い分けを解説

はじめに

C#で文字列を扱っていると、「既存のstringに文字をappendしたい」「JavaScriptやJavaのようにappendメソッドで文字列を追加したい」と考えることがあります。

しかし、C#のstring型にはAppendメソッドはありません。C#で文字列を追加・結合する場合は、+演算子、+=演算子、文字列補間、string.Concatstring.Join、そしてStringBuilder.Appendなどを目的に応じて使い分けます。

特に重要なのは、少量の文字列結合であれば+演算子や文字列補間で十分ですが、ループ内で何度も文字列を追加する場合はStringBuilderを使うのが基本という点です。

この記事では、C#でstringをappendする方法を、文字列結合の基本からStringBuilder.Appendの使い方、使い分け、よくあるエラーまでわかりやすく解説します。

1. C#でstringをappendしたいときの基本

1-1. C#のstringにはappendメソッドがない

C#で次のようなコードを書こうとすると、エラーになります。

C#
string text = "Hello";
text.Append(" World");

string型にはAppendというメソッドが定義されていないためです。

C#でAppendを使いたい場合は、stringではなくStringBuilderを使用します。

C#
using System.Text;

StringBuilder sb = new StringBuilder();
sb.Append("Hello");
sb.Append(" World");

string result = sb.ToString();
Console.WriteLine(result);

実行結果は次のとおりです。

C#
Hello World

つまり、C#で「stringをappendしたい」と思った場合、実際には次のどちらかを選ぶことになります。

C#
// stringを結合する
string text = "Hello";
text += " World";

// StringBuilderで追加する
StringBuilder sb = new StringBuilder();
sb.Append("Hello");
sb.Append(" World");

1-2. 「string append」で検索する人が知りたいこと

「C# string append」と検索する人が知りたいのは、多くの場合、次のような内容です。

C#のstringに文字列を追加する方法を知りたい、Appendメソッドが使えない理由を知りたい、+=StringBuilder.Appendの違いを知りたい、どちらを使うべきか判断したい、ループ内で効率よく文字列を結合したい、といった疑問です。

C#では、単純に文字列をつなげたいだけなら++=で問題ありません。

C#
string message = "こんにちは";
message += "、";
message += "世界";

Console.WriteLine(message);

ただし、何百回、何千回と文字列を追加する処理では、StringBuilderを使ったほうが効率的です。

C#
using System.Text;

StringBuilder sb = new StringBuilder();

for (int i = 0; i < 1000; i++)
{
sb.Append(i);
sb.Append(",");
}

string result = sb.ToString();

1-3. C#で文字列を追加・結合する主な方法

C#で文字列を追加・結合する主な方法は次のとおりです。

C#
// +演算子
string text1 = "Hello" + " World";

// +=演算子
string text2 = "Hello";
text2 += " World";

// 文字列補間
string name = "佐藤";
string text3 = $"こんにちは、{name}さん";

// string.Concat
string text4 = string.Concat("Hello", " ", "World");

// string.Join
string text5 = string.Join(",", new[] { "A", "B", "C" });

// StringBuilder.Append
StringBuilder sb = new StringBuilder();
sb.Append("Hello");
sb.Append(" World");
string text6 = sb.ToString();

それぞれに向いている場面があります。すべてをStringBuilderに置き換える必要はありません。

1-4. 結論:少量なら+や文字列補間、繰り返しならStringBuilder

C#でstringをappendしたい場合の結論はシンプルです。

少ない回数の文字列結合であれば、+演算子や文字列補間を使うのが読みやすく、自然です。

C#
string firstName = "Taro";
string lastName = "Yamada";

string fullName = firstName + " " + lastName;
string message = $"Hello, {fullName}";

一方、ループの中で繰り返し文字列を追加する場合や、長い文章、HTML、CSV、ログなどを組み立てる場合は、StringBuilder.Appendを使うと効率的です。

C#
using System.Text;

StringBuilder sb = new StringBuilder();

for (int i = 1; i <= 5; i++)
{
sb.Append("No.");
sb.Append(i);
sb.AppendLine();
}

Console.WriteLine(sb.ToString());

基本的には、可読性を優先して書き、必要に応じてStringBuilderを使うと考えるとよいでしょう。

2. stringに文字列を追加する方法

2-1. +演算子で文字列を結合する

C#で最も基本的な文字列結合は、+演算子を使う方法です。

C#
string greeting = "Hello";
string name = "Taro";

string message = greeting + ", " + name;

Console.WriteLine(message);

実行結果は次のとおりです。

C#
Hello, Taro

+演算子は直感的で、短い文字列を結合する場合に便利です。

C#
string protocol = "https://";
string domain = "example.com";
string path = "/articles";

string url = protocol + domain + path;

Console.WriteLine(url);

実行結果は次のようになります。

C#
https://example.com/articles

ただし、結合する要素が多くなると、コードが読みにくくなる場合があります。

C#
string result = "名前:" + name + "、年齢:" + age + "、住所:" + address;

このような場合は、文字列補間を使ったほうが読みやすくなります。

2-2. +=演算子で既存の文字列に追加する

既存の文字列に文字列を追加したい場合は、+=演算子を使えます。

C#
string text = "C#";
text += "で";
text += "文字列を";
text += "結合する";

Console.WriteLine(text);

実行結果は次のとおりです。

C#
C#で文字列を結合する

+=は、既存の変数に文字列を追加していく書き方なので、「appendしたい」という感覚に近い方法です。

C#
string log = "";

log += "処理を開始しました\n";
log += "データを読み込みました\n";
log += "処理が完了しました\n";

Console.WriteLine(log);

ただし、+=は内部的に既存の文字列を直接変更しているわけではありません。C#のstringは変更できない型なので、結合のたびに新しい文字列が作られます。

少ない回数であれば問題ありませんが、ループ内で大量に使う場合は注意が必要です。

C#
string result = "";

for (int i = 0; i < 10000; i++)
{
result += i.ToString();
}

このような処理では、StringBuilderの使用を検討します。

2-3. 文字列補間で読みやすく結合する

文字列補間は、$"..."の中に変数や式を埋め込める機能です。

C#
string name = "田中";
int age = 30;

string message = $"名前は{name}です。年齢は{age}歳です。";

Console.WriteLine(message);

実行結果は次のとおりです。

C#
名前は田中です。年齢は30歳です。

文字列補間を使うと、+演算子で細かく結合するよりも読みやすくなります。

C#
string message1 = "名前は" + name + "です。年齢は" + age + "歳です。";
string message2 = $"名前は{name}です。年齢は{age}歳です。";

特に、変数を含むメッセージ、ログ、画面表示用の文字列を作る場合に便利です。

C#
decimal price = 1200;
int quantity = 3;

string summary = $"単価は{price}円、数量は{quantity}個、合計は{price * quantity}円です。";

Console.WriteLine(summary);

文字列補間は可読性が高いため、少量の文字列結合では非常によく使われます。

2-4. string.Concatで複数の文字列を結合する

string.Concatを使って、複数の文字列を結合することもできます。

C#
string result = string.Concat("C#", " ", "string", " ", "append");

Console.WriteLine(result);

実行結果は次のとおりです。

C#
C# string append

string.Concatは、区切り文字なしで文字列を連結します。

C#
string first = "Hello";
string second = "World";

string message = string.Concat(first, second);

Console.WriteLine(message);

実行結果は次のようになります。

C#
HelloWorld

スペースやカンマを入れたい場合は、自分で指定する必要があります。

C#
string message = string.Concat(first, " ", second);

string.Concatは、複数の値をまとめて結合したいときに使えますが、一般的なコードでは+演算子や文字列補間のほうが読みやすいケースも多いです。

2-5. string.Joinで配列やリストを区切り文字付きで結合する

配列やリストの要素を区切り文字付きで結合する場合は、string.Joinが便利です。

C#
string[] fruits = { "apple", "banana", "orange" };

string result = string.Join(",", fruits);

Console.WriteLine(result);

実行結果は次のとおりです。

C#
apple,banana,orange

スペース付きのカンマで区切ることもできます。

C#
string result = string.Join(", ", fruits);

Console.WriteLine(result);

実行結果は次のようになります。

C#
apple, banana, orange

リストにも使用できます。

C#
List<string> names = new List<string> { "田中", "佐藤", "鈴木" };

string result = string.Join(" / ", names);

Console.WriteLine(result);

実行結果は次のとおりです。

C#
田中 / 佐藤 / 鈴木

CSV形式の文字列や、画面表示用の一覧文字列を作る場合は、string.Joinを使うと簡潔に書けます。

3. StringBuilder.Appendで文字列を追加する方法

3-1. StringBuilderとは

StringBuilderは、文字列を効率よく追加・変更するためのクラスです。

C#のstringは一度作成すると中身を変更できません。そのため、文字列を何度も結合すると、そのたびに新しい文字列が作られます。

一方、StringBuilderは内部に文字列を組み立てるためのバッファを持っており、そこに文字を追加していきます。

C#
using System.Text;

StringBuilder sb = new StringBuilder();

sb.Append("Hello");
sb.Append(" ");
sb.Append("World");

Console.WriteLine(sb.ToString());

実行結果は次のとおりです。

C#
Hello World

StringBuilderは、次のような場面でよく使われます。

ループ内で文字列を何度も追加する場合、長い文章を組み立てる場合、HTMLやSQLのような複数行の文字列を作る場合、ログメッセージを蓄積する場合などです。

3-2. StringBuilder.Appendの基本構文

StringBuilder.Appendの基本構文は次のとおりです。

C#
StringBuilder sb = new StringBuilder();

sb.Append("追加したい文字列");

実際のコードでは、最後にToStringを呼び出してstringに変換します。

C#
using System.Text;

StringBuilder sb = new StringBuilder();

sb.Append("C#");
sb.Append("で");
sb.Append("stringを");
sb.Append("appendする");

string result = sb.ToString();

Console.WriteLine(result);

実行結果は次のとおりです。

C#
C#でstringをappendする

Appendには文字列だけでなく、数値や真偽値なども渡せます。

C#
StringBuilder sb = new StringBuilder();

sb.Append("価格:");
sb.Append(1200);
sb.Append("円");

Console.WriteLine(sb.ToString());

実行結果は次のとおりです。

C#
価格:1200円

3-3. AppendLineで改行付きの文字列を追加する

改行付きで文字列を追加したい場合は、AppendLineを使います。

C#
using System.Text;

StringBuilder sb = new StringBuilder();

sb.AppendLine("1行目");
sb.AppendLine("2行目");
sb.AppendLine("3行目");

Console.WriteLine(sb.ToString());

実行結果は次のようになります。

C#
1行目
2行目
3行目

AppendLineは、文字列の末尾に改行を追加します。ログや複数行テキストを作るときに便利です。

C#
StringBuilder log = new StringBuilder();

log.AppendLine("処理開始");
log.AppendLine("データ取得");
log.AppendLine("処理終了");

Console.WriteLine(log.ToString());

文字列だけを追加して改行したくない場合はAppend、改行も含めたい場合はAppendLineを使います。

C#
sb.Append("改行なし");
sb.AppendLine("改行あり");

3-4. AppendFormatで書式付き文字列を追加する

書式を指定して文字列を追加したい場合は、AppendFormatを使えます。

C#
using System.Text;

StringBuilder sb = new StringBuilder();

string name = "田中";
int score = 85;

sb.AppendFormat("{0}さんの点数は{1}点です。", name, score);

Console.WriteLine(sb.ToString());

実行結果は次のとおりです。

C#
田中さんの点数は85点です。

数値の表示形式を指定することもできます。

C#
StringBuilder sb = new StringBuilder();

decimal price = 1234.5m;

sb.AppendFormat("価格は{0:N0}円です。", price);

Console.WriteLine(sb.ToString());

実行結果は次のようになります。

C#
価格は1,235円です。

ただし、最近のC#では文字列補間のほうが読みやすい場面も多いです。

C#
sb.Append($"価格は{price:N0}円です。");

可読性を重視するなら文字列補間、既存コードやフォーマット指定を使いたい場合はAppendFormatと考えるとよいでしょう。

3-5. ToStringでstringに変換する

StringBuilderで組み立てた内容を通常のstringとして使うには、ToStringを呼び出します。

C#
using System.Text;

StringBuilder sb = new StringBuilder();

sb.Append("Hello");
sb.Append(" ");
sb.Append("World");

string result = sb.ToString();

Console.WriteLine(result);

StringBuilder自体はstringではありません。そのため、メソッドの戻り値や画面表示、ファイル出力などでstringが必要な場合は、ToStringで変換します。

C#
public string CreateMessage()
{
StringBuilder sb = new StringBuilder();

sb.Append("メッセージ:");
sb.Append("処理が完了しました");

return sb.ToString();
}

Appendしただけでは、string変数に自動で変換されるわけではない点に注意しましょう。

4. string結合とStringBuilder.Appendの違い

4-1. stringはイミュータブルで変更できない

C#のstringはイミュータブルです。イミュータブルとは、一度作成した値を変更できないという意味です。

たとえば、次のコードを見てみます。

C#
string text = "Hello";
text += " World";

このコードは、textの中身を直接書き換えているように見えます。

しかし実際には、元の"Hello"という文字列を変更しているのではなく、"Hello World"という新しい文字列を作成して、text変数に代入し直しています。

C#
string text = "Hello";
string newText = text + " World";
text = newText;

このような仕組みのため、少ない回数の結合なら問題ありませんが、大量の結合では新しい文字列が何度も作られることになります。

4-2. +=は新しい文字列を作り直す

+=演算子は、既存の文字列に追加しているように見えますが、内部的には新しい文字列を作っています。

C#
string result = "";

result += "A";
result += "B";
result += "C";

この場合、処理のイメージは次のようになります。

C#
result = "" + "A";
result = "A" + "B";
result = "AB" + "C";

結果として"ABC"になりますが、途中で複数の文字列が作成されます。

特に次のようなループでは注意が必要です。

C#
string result = "";

for (int i = 0; i < 10000; i++)
{
result += i;
}

結合回数が多い場合は、StringBuilderを使ったほうが効率的です。

C#
StringBuilder sb = new StringBuilder();

for (int i = 0; i < 10000; i++)
{
sb.Append(i);
}

string result = sb.ToString();

4-3. StringBuilderは内部バッファに文字を追加する

StringBuilderは、内部のバッファに文字を追加していきます。

C#
StringBuilder sb = new StringBuilder();

sb.Append("A");
sb.Append("B");
sb.Append("C");

string result = sb.ToString();

stringのように毎回新しい文字列を作り直すのではなく、文字列を組み立てるための領域を使って効率よく追加できます。

そのため、次のような処理に向いています。

C#
StringBuilder sb = new StringBuilder();

for (int i = 1; i <= 1000; i++)
{
sb.Append("行番号:");
sb.Append(i);
sb.AppendLine();
}

string result = sb.ToString();

大量の文字列を追加する場合、StringBuilderを使うことでメモリ使用量や処理時間の面で有利になりやすいです。

4-4. メモリ使用量とパフォーマンスの違い

stringの結合では、結合するたびに新しい文字列が作られる場合があります。そのため、繰り返し結合すると不要になった文字列が増え、メモリ使用量が増える可能性があります。

C#
string result = "";

for (int i = 0; i < 10000; i++)
{
result += "x";
}

一方、StringBuilderは文字列を追加するためのバッファを使うため、繰り返し追加する処理に向いています。

C#
StringBuilder sb = new StringBuilder();

for (int i = 0; i < 10000; i++)
{
sb.Append("x");
}

string result = sb.ToString();

ただし、常にStringBuilderが最速というわけではありません。

短い文字列を数回結合するだけなら、+演算子や文字列補間のほうが簡潔で、パフォーマンス上の問題もほとんどありません。

C#
string message = $"こんにちは、{name}さん";

つまり、パフォーマンスだけでなく、コードの読みやすさも含めて選ぶことが大切です。

4-5. 可読性と保守性の違い

少量の文字列結合では、StringBuilderを使うよりも、+演算子や文字列補間のほうが読みやすくなります。

C#
string message = $"ユーザー名:{userName}、年齢:{age}";

これをStringBuilderで書くと、やや冗長になります。

C#
StringBuilder sb = new StringBuilder();

sb.Append("ユーザー名:");
sb.Append(userName);
sb.Append("、年齢:");
sb.Append(age);

string message = sb.ToString();

一方で、複数行のHTMLやログを作る場合は、StringBuilderのほうが構造を整理しやすいことがあります。

C#
StringBuilder sb = new StringBuilder();

sb.AppendLine("<ul>");
sb.AppendLine(" <li>Apple</li>");
sb.AppendLine(" <li>Banana</li>");
sb.AppendLine("</ul>");

string html = sb.ToString();

可読性と保守性を考えるなら、短い文字列はシンプルに、長く複雑な文字列はStringBuilderで整理するのがおすすめです。

5. stringとStringBuilderの使い分け

5-1. 少ない回数の結合なら+演算子や文字列補間を使う

文字列を数回結合するだけなら、+演算子や文字列補間で十分です。

C#
string firstName = "Taro";
string lastName = "Yamada";

string fullName = firstName + " " + lastName;

より読みやすく書くなら、文字列補間がおすすめです。

C#
string fullName = $"{firstName} {lastName}";

メッセージを作る場合も、文字列補間を使うと自然です。

C#
string message = $"こんにちは、{fullName}さん";

このような単純な文字列結合で、無理にStringBuilderを使う必要はありません。

5-2. ループ内で何度も追加するならStringBuilderを使う

ループ内で何度も文字列を追加する場合は、StringBuilderを使うのが基本です。

C#
using System.Text;

StringBuilder sb = new StringBuilder();

for (int i = 1; i <= 1000; i++)
{
sb.Append("No.");
sb.Append(i);
sb.AppendLine();
}

string result = sb.ToString();

+=で同じ処理を書くこともできます。

C#
string result = "";

for (int i = 1; i <= 1000; i++)
{
result += "No." + i + "\n";
}

しかし、繰り返し回数が多い場合は、文字列が何度も作り直されるため非効率になりやすいです。

ループで文字列を組み立てる場合は、最初からStringBuilderを使うとよいでしょう。

5-3. 配列やリストの結合ならstring.Joinを使う

配列やリストの要素を結合する場合は、StringBuilderよりもstring.Joinが適しています。

C#
string[] values = { "A", "B", "C" };

string result = string.Join(",", values);

Console.WriteLine(result);

実行結果は次のとおりです。

C#
A,B,C

リストでも同じように使えます。

C#
List<string> tags = new List<string> { "C#", "string", "append" };

string result = string.Join(", ", tags);

Console.WriteLine(result);

実行結果は次のようになります。

C#
C#, string, append

区切り文字付きで一覧を作る場合は、string.Joinを使うと簡潔で読みやすいコードになります。

5-4. フォーマット重視なら文字列補間を使う

変数を埋め込んで読みやすい文章を作る場合は、文字列補間が便利です。

C#
string name = "佐藤";
int count = 5;

string message = $"{name}さんは{count}件の通知があります。";

数値や日付の書式も指定できます。

C#
decimal price = 1980;
DateTime date = new DateTime(2026, 6, 19);

string message = $"価格:{price:N0}円、日付:{date:yyyy/MM/dd}";

実行結果は次のようになります。

C#
価格:1,980円、日付:2026/06/19

単純な結合ではなく、人が読むメッセージを作る場合は、文字列補間を優先するとよいでしょう。

5-5. 長文やログ生成ならStringBuilderを検討する

長文やログを生成する場合は、StringBuilderが向いています。

C#
StringBuilder log = new StringBuilder();

log.AppendLine("=== 処理ログ ===");
log.AppendLine("開始時刻:2026/06/19 10:00");
log.AppendLine("データ件数:100件");
log.AppendLine("処理結果:成功");

string result = log.ToString();

Console.WriteLine(result);

HTMLを組み立てる場合にも使えます。

C#
StringBuilder html = new StringBuilder();

html.AppendLine("<section>");
html.AppendLine(" <h2>記事タイトル</h2>");
html.AppendLine(" <p>本文です。</p>");
html.AppendLine("</section>");

string result = html.ToString();

複数行の文字列を段階的に作る場合は、AppendLineを使うと見通しがよくなります。

6. 実践コードで学ぶ文字列appendの使い方

6-1. 名前やメッセージを+演算子で結合する例

まずは、+演算子で名前やメッセージを結合する例です。

C#
string firstName = "Taro";
string lastName = "Yamada";

string fullName = firstName + " " + lastName;

Console.WriteLine(fullName);

実行結果は次のとおりです。

C#
Taro Yamada

メッセージを追加する場合も同じです。

C#
string message = "こんにちは、" + fullName + "さん";

Console.WriteLine(message);

実行結果は次のようになります。

C#
こんにちは、Taro Yamadaさん

短い文字列を結合するだけなら、+演算子で十分です。

6-2. +=で文字列を順番に追加する例

次に、+=で文字列を順番に追加する例です。

C#
string text = "";

text += "C#";
text += "で";
text += "stringを";
text += "appendする";
text += "方法";

Console.WriteLine(text);

実行結果は次のとおりです。

C#
C#でstringをappendする方法

文章を段階的に作りたいときには、+=を使うとわかりやすい場合があります。

C#
string report = "";

report += "売上レポート\n";
report += "対象月:6月\n";
report += "売上:1,000,000円\n";

Console.WriteLine(report);

ただし、行数が多い場合やループで繰り返す場合は、StringBuilderの使用を検討しましょう。

6-3. StringBuilder.AppendでHTMLを組み立てる例

StringBuilder.Appendを使ってHTMLを組み立てる例です。

C#
using System.Text;

StringBuilder sb = new StringBuilder();

sb.Append("<div>");
sb.Append("<h1>");
sb.Append("C#でstringをappendする方法");
sb.Append("</h1>");
sb.Append("<p>");
sb.Append("StringBuilderを使うと効率よく文字列を追加できます。");
sb.Append("</p>");
sb.Append("</div>");

string html = sb.ToString();

Console.WriteLine(html);

実行結果は次のようになります。

C#
<div><h1>C#でstringをappendする方法</h1><p>StringBuilderを使うと効率よく文字列を追加できます。</p></div>

改行を入れて見やすいHTMLを作るなら、AppendLineを使うと便利です。

C#
StringBuilder sb = new StringBuilder();

sb.AppendLine("<div>");
sb.AppendLine(" <h1>C#でstringをappendする方法</h1>");
sb.AppendLine(" <p>StringBuilderを使うと効率よく文字列を追加できます。</p>");
sb.AppendLine("</div>");

string html = sb.ToString();

Console.WriteLine(html);

6-4. ループ処理でStringBuilderを使う例

ループ処理で文字列を追加する場合は、StringBuilderが適しています。

C#
using System.Text;

StringBuilder sb = new StringBuilder();

for (int i = 1; i <= 5; i++)
{
sb.Append("項目");
sb.Append(i);
sb.AppendLine();
}

string result = sb.ToString();

Console.WriteLine(result);

実行結果は次のとおりです。

C#
項目1
項目2
項目3
項目4
項目5

リストの内容をHTMLのリストに変換する例も見てみましょう。

C#
using System.Text;

List<string> items = new List<string> { "Apple", "Banana", "Orange" };

StringBuilder sb = new StringBuilder();

sb.AppendLine("<ul>");

foreach (string item in items)
{
sb.Append(" <li>");
sb.Append(item);
sb.AppendLine("</li>");
}

sb.AppendLine("</ul>");

string html = sb.ToString();

Console.WriteLine(html);

実行結果は次のようになります。

C#
<ul>
<li>Apple</li>
<li>Banana</li>
<li>Orange</li>
</ul>

6-5. string.JoinでCSV形式の文字列を作る例

CSV形式の文字列を作る場合は、string.Joinが便利です。

C#
string[] values = { "1001", "田中", "tokyo@example.com" };

string csvLine = string.Join(",", values);

Console.WriteLine(csvLine);

実行結果は次のとおりです。

C#
1001,田中,tokyo@example.com

複数行のCSVを作る場合は、StringBuilderstring.Joinを組み合わせると便利です。

C#
using System.Text;

List<string[]> rows = new List<string[]>
{
new string[] { "ID", "Name", "Email" },
new string[] { "1", "田中", "tanaka@example.com" },
new string[] { "2", "佐藤", "sato@example.com" }
};

StringBuilder sb = new StringBuilder();

foreach (string[] row in rows)
{
sb.AppendLine(string.Join(",", row));
}

string csv = sb.ToString();

Console.WriteLine(csv);

実行結果は次のようになります。

C#
ID,Name,Email
1,田中,tanaka@example.com
2,佐藤,sato@example.com

配列やリストの要素を区切り文字付きで結合するならstring.Join、複数行を組み立てるならStringBuilderを組み合わせるとよいでしょう。

7. StringBuilder.Appendを使うときの注意点

7-1. 必ずToStringでstringに変換する

StringBuilderで文字列を組み立てた後は、必要に応じてToStringstringに変換します。

C#
StringBuilder sb = new StringBuilder();

sb.Append("Hello");
sb.Append(" World");

string result = sb.ToString();

StringBuilder型のままでもConsole.WriteLineに渡せる場合はありますが、メソッドの戻り値や変数としてstringが必要な場合はToStringが必要です。

C#
public string CreateText()
{
StringBuilder sb = new StringBuilder();

sb.Append("C#");
sb.Append(" string append");

return sb.ToString();
}

次のように、StringBuilderをそのままstringに代入することはできません。

C#
StringBuilder sb = new StringBuilder();
sb.Append("Hello");

// エラー
string result = sb;

正しくは次のように書きます。

C#
string result = sb.ToString();

7-2. using System.Textを追加する

StringBuilderを使うには、通常はファイルの先頭にusing System.Text;を追加します。

C#
using System.Text;

StringBuilder sb = new StringBuilder();
sb.Append("Hello");

using System.Text;を書かない場合は、完全修飾名で指定することもできます。

C#
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("Hello");

ただし、毎回System.Text.StringBuilderと書くと長くなるため、基本的にはusing System.Text;を追加するのがおすすめです。

7-3. Appendにnullを渡したときの挙動

StringBuilder.Appendnullを渡した場合、例外が発生するわけではなく、基本的には何も追加されません。

C#
StringBuilder sb = new StringBuilder();

string value = null;

sb.Append("A");
sb.Append(value);
sb.Append("B");

Console.WriteLine(sb.ToString());

実行結果は次のとおりです。

C#
AB

nullを明示的に別の文字列として表示したい場合は、事前に変換します。

C#
string value = null;

sb.Append(value ?? "(null)");

このように書くと、valuenullの場合に"(null)"を追加できます。

C#
(null)

nullの可能性がある値を扱う場合は、意図した表示になるように確認しましょう。

7-4. 小規模な結合では過剰に使わない

StringBuilderは便利ですが、すべての文字列結合に使う必要はありません。

たとえば、次のような短い文字列であれば、文字列補間のほうが読みやすいです。

C#
string message = $"こんにちは、{name}さん";

これをStringBuilderで書くと、かえって冗長になります。

C#
StringBuilder sb = new StringBuilder();

sb.Append("こんにちは、");
sb.Append(name);
sb.Append("さん");

string message = sb.ToString();

StringBuilderは、ループや長文生成など、文字列を何度も追加する場面で使うと効果的です。

少ない回数の結合では、+演算子や文字列補間を優先しましょう。

7-5. 文字列補間をAppend内で多用しすぎない

StringBuilder.Appendの中で文字列補間を使うことはできます。

C#
sb.Append($"名前:{name}、年齢:{age}");

この書き方は読みやすい場合もありますが、ループ内で多用すると、補間された文字列が毎回作られてからAppendされることになります。

C#
foreach (var user in users)
{
sb.AppendLine($"名前:{user.Name}、年齢:{user.Age}");
}

多くの場合は問題ありませんが、パフォーマンスを重視する場面では、次のように分けて追加する方法もあります。

C#
foreach (var user in users)
{
sb.Append("名前:");
sb.Append(user.Name);
sb.Append("、年齢:");
sb.Append(user.Age);
sb.AppendLine();
}

可読性を優先するか、効率を優先するかは、処理の規模や目的に応じて判断しましょう。

8. よくあるエラーと対処法

8-1. string.Appendが使えない原因

次のように書くとエラーになります。

C#
string text = "Hello";
text.Append(" World");

原因は、string型にはAppendメソッドがないためです。

stringに文字列を追加したい場合は、+=を使います。

C#
string text = "Hello";
text += " World";

Console.WriteLine(text);

または、StringBuilderを使います。

C#
using System.Text;

StringBuilder sb = new StringBuilder();

sb.Append("Hello");
sb.Append(" World");

string text = sb.ToString();

Console.WriteLine(text);

Appendを使いたい場合は、stringではなくStringBuilderを使うと覚えておきましょう。

8-2. StringBuilderが見つからない場合

次のようなエラーが出る場合があります。

C#
StringBuilder sb = new StringBuilder();

StringBuilderが見つからない場合は、using System.Text;が不足している可能性があります。

ファイルの先頭に次の行を追加します。

C#
using System.Text;

または、完全修飾名で書きます。

C#
System.Text.StringBuilder sb = new System.Text.StringBuilder();

基本的には、次のように書くのが一般的です。

C#
using System.Text;

StringBuilder sb = new StringBuilder();

8-3. Append後の結果が表示されない場合

Appendしたのに期待した結果が表示されない場合、ToStringしていない可能性があります。

C#
StringBuilder sb = new StringBuilder();

sb.Append("Hello");
sb.Append(" World");

string result = sb.ToString();

Console.WriteLine(result);

メソッドで返す場合も同じです。

C#
public string GetMessage()
{
StringBuilder sb = new StringBuilder();

sb.Append("処理が完了しました");

return sb.ToString();
}

StringBuilderに追加した内容をstringとして使うには、最後にToStringすることを忘れないようにしましょう。

8-4. 改行されない場合

Appendは文字列をそのまま追加するだけなので、自動では改行されません。

C#
StringBuilder sb = new StringBuilder();

sb.Append("1行目");
sb.Append("2行目");

Console.WriteLine(sb.ToString());

実行結果は次のようになります。

C#
1行目2行目

改行したい場合は、AppendLineを使います。

C#
StringBuilder sb = new StringBuilder();

sb.AppendLine("1行目");
sb.AppendLine("2行目");

Console.WriteLine(sb.ToString());

または、明示的に改行文字を追加します。

C#
sb.Append("1行目");
sb.Append(Environment.NewLine);
sb.Append("2行目");

複数行の文字列を作る場合は、AppendLineを使うと簡単です。

8-5. 期待した区切り文字が入らない場合

string.ConcatAppendは、区切り文字を自動では入れません。

C#
string result = string.Concat("A", "B", "C");

Console.WriteLine(result);

実行結果は次のとおりです。

C#
ABC

カンマ区切りにしたい場合は、自分でカンマを追加する必要があります。

C#
StringBuilder sb = new StringBuilder();

sb.Append("A");
sb.Append(",");
sb.Append("B");
sb.Append(",");
sb.Append("C");

Console.WriteLine(sb.ToString());

配列やリストを区切り文字付きで結合するなら、string.Joinを使うのが簡単です。

C#
string[] values = { "A", "B", "C" };

string result = string.Join(",", values);

Console.WriteLine(result);

実行結果は次のようになります。

C#
A,B,C

区切り文字が必要な場合は、string.Joinを優先して検討しましょう。

9. よくある質問

9-1. C#のstringにappendメソッドはありますか?

C#のstring型にはAppendメソッドはありません。

次のコードはエラーになります。

C#
string text = "Hello";
text.Append(" World");

文字列を追加したい場合は、+=演算子を使います。

C#
string text = "Hello";
text += " World";

Appendメソッドを使いたい場合は、StringBuilderを使用します。

C#
StringBuilder sb = new StringBuilder();

sb.Append("Hello");
sb.Append(" World");

string result = sb.ToString();

9-2. stringとStringBuilderはどちらが速いですか?

少ない回数の結合であれば、string+演算子や文字列補間で十分です。

C#
string message = $"Hello, {name}";

一方、ループ内で何度も文字列を追加する場合は、StringBuilderのほうが効率的になりやすいです。

C#
StringBuilder sb = new StringBuilder();

for (int i = 0; i < 10000; i++)
{
sb.Append(i);
}

つまり、常にどちらかが速いというより、処理内容によって使い分けることが大切です。

9-3. +=演算子は使わないほうがいいですか?

+=演算子を使ってはいけないわけではありません。

少ない回数の文字列追加であれば、+=はシンプルでわかりやすい書き方です。

C#
string text = "Hello";
text += " World";

ただし、ループ内で何度も+=を使う場合は注意が必要です。

C#
string result = "";

for (int i = 0; i < 10000; i++)
{
result += i;
}

このような場合は、StringBuilderを使うほうが適しています。

C#
StringBuilder sb = new StringBuilder();

for (int i = 0; i < 10000; i++)
{
sb.Append(i);
}

9-4. AppendとAppendLineの違いは何ですか?

Appendは、文字列をそのまま追加します。

C#
sb.Append("Hello");
sb.Append("World");

結果は次のようになります。

C#
HelloWorld

AppendLineは、文字列を追加したあとに改行も追加します。

C#
sb.AppendLine("Hello");
sb.AppendLine("World");

結果は次のようになります。

C#
Hello
World

改行なしで追加したい場合はAppend、行単位で追加したい場合はAppendLineを使いましょう。

9-5. 文字列補間とStringBuilderはどちらを使うべきですか?

少量の文字列を読みやすく組み立てたい場合は、文字列補間がおすすめです。

C#
string message = $"{name}さんの点数は{score}点です。";

一方、ループ内で何度も文字列を追加する場合や、長い文章を段階的に作る場合は、StringBuilderが向いています。

C#
StringBuilder sb = new StringBuilder();

foreach (var item in items)
{
sb.AppendLine(item);
}

string result = sb.ToString();

読みやすさを重視するなら文字列補間、繰り返し追加や長文生成ならStringBuilderと考えるとよいでしょう。

まとめ

C#でstringをappendしたい場合、まず知っておきたいのは、string型にはAppendメソッドがないという点です。

文字列を追加・結合する方法には、+演算子、+=演算子、文字列補間、string.Concatstring.JoinStringBuilder.Appendなどがあります。

少ない回数の文字列結合であれば、+演算子や文字列補間を使うのが簡単で読みやすいです。

C#
string message = $"こんにちは、{name}さん";

既存の文字列に少しずつ追加したい場合は、+=も使えます。

C#
string text = "C#";
text += " string";
text += " append";

配列やリストを区切り文字付きで結合する場合は、string.Joinが便利です。

C#
string result = string.Join(",", values);

ループ内で何度も文字列を追加する場合や、長文、HTML、CSV、ログなどを組み立てる場合は、StringBuilder.Appendを使うと効率的です。

C#
using System.Text;

StringBuilder sb = new StringBuilder();

sb.Append("C#");
sb.Append("で");
sb.Append("文字列を追加する");

string result = sb.ToString();

C#で文字列をappendする方法はひとつではありません。短い文字列なら+や文字列補間、繰り返し追加するならStringBuilder、一覧の結合ならstring.Joinというように、目的に合わせて使い分けることが大切です。