C#の文字列補間は、文字列の中に変数や式を読みやすく埋め込める機能です。
$記号を付けた文字列の中で{…}を書くだけなので、初心者の方にもすぐに使いこなせます。
本記事では、基本の使い方から書式指定、エスケープ、つまずきやすいポイントまで、やさしく丁寧に解説します。
C#の文字列補間($”…”)の基本
{変数}を埋め込む書き方
いちばん基本の形
$"..."
と書き、埋め込みたい場所に{変数名}
を置きます。
従来の+
連結より読みやすく、タイプミスも減らせます。
using System;
class Program
{
static void Main()
{
// 変数を用意
string name = "Taro";
int age = 20;
// 文字列補間:$ を先頭に付け、{変数}を埋め込む
string message = $"こんにちは、{name}さん。あなたは{age}歳ですね。";
Console.WriteLine(message);
}
}
こんにちは、Taroさん。あなたは20歳ですね。
どこにでも書ける
補間文字列は変数代入だけでなく、メソッド引数に直接書けます。
Console.WriteLine($"現在時刻: {DateTime.Now}");
Console.WriteLineで使う
複数の値をまとめて表示
複数の値を1行で分かりやすく表示できます。
using System;
class Program
{
static void Main()
{
string product = "Keyboard";
int quantity = 3;
double price = 2980.5;
// 複数の変数を1つのメッセージに
Console.WriteLine($"商品: {product}, 個数: {quantity}, 合計: {price * quantity}円");
}
}
商品: Keyboard, 個数: 3, 合計: 8941.5円
入力と組み合わせる
Console.ReadLineで受け取った入力も、そのまま補間できます。
using System;
class Program
{
static void Main()
{
Console.Write("お名前を入力してください: ");
string name = Console.ReadLine(); // キーボードから入力
Console.WriteLine($"ようこそ、{name}さん!");
}
}
お名前を入力してください: Hanako
ようこそ、Hanakoさん!
文字列連結(+)との違い
読みやすさと保守性
補間は「テンプレートの穴埋め」なので、文章の形が崩れません。
一方+
連結は括弧や空白の位置ミスが起きやすく、式が長いほど可読性が落ちます。
// 補間(読みやすい)
string s1 = $"合計は {a + b}、平均は {(a + b) / 2.0} です。";
// 連結(カッコや空白の管理が大変)
string s2 = "合計は " + (a + b) + "、平均は " + ((a + b) / 2.0) + " です。";
パフォーマンスの観点
補間は内部的に文字列連結や複合書式(string.Format)相当へ最適化されます。
短い文章では差は感じにくいですが、繰り返し大量連結する場面はStringBuilder
などを検討します(本記事では詳細割愛)。
対応バージョン(C# 6以降)
使える環境
文字列補間はC# 6以降で利用可能です。
Visual Studio 2015以降、.NET Framework 4.6以降や .NET Core/.NET 5+ で一般的に利用できます。
プロジェクトの言語バージョンが古い場合は、.csprojでLangVersion
を上げます。
<!-- .csproj の例 -->
<PropertyGroup>
<LangVersion>latest</LangVersion> <!-- もしくは 10 など -->
</PropertyGroup>
文字列補間の応用(式と書式指定)
{a + b}など式を埋め込む
計算や条件式もOK
{…}の中には式を書けます。
ただし長くなりすぎると読みにくくなるため、適度に変数へ分けると良いです。
using System;
class Program
{
static void Main()
{
int a = 7, b = 3;
bool isEven = ((a + b) % 2) == 0;
Console.WriteLine($"a + b = {a + b}, 偶数ですか? {isEven}");
Console.WriteLine($"大きい方は {(a > b ? a : b)} です。");
}
}
a + b = 10, 偶数ですか? True
大きい方は 7 です。
数値の書式 {n:0.00} {n:N0} {r:P}
代表的な数値フォーマット
コロン(:)の右側に書式指定子を置くと、整形された文字列に変換できます。
以下はよく使う例です。
指定例 | 意味 | 例(値: 12345.678) |
---|---|---|
{n:0.00} | 固定小数点(小数2桁) | 12345.68 |
{n:N0} | 桁区切り(小数0桁) | 12,346 |
{r:P} | パーセント(×100, 小数2桁) | 12,345.68% |
using System;
using System.Globalization;
class Program
{
static void Main()
{
double n = 12345.678;
double r = 123.45678; // 比率として扱う例(1.0 = 100%)
// CurrentCultureの影響を受ける点に注意(, や . の記号)
Console.WriteLine($"固定小数点: {n:0.00}");
Console.WriteLine($"桁区切り(小数なし): {n:N0}");
Console.WriteLine($"パーセント: {r:P}");
}
}
固定小数点: 12345.68
桁区切り(小数なし): 12,346
パーセント: 12,345.68%
追加の小技
通貨(C)や16進(X)なども利用できます。
日本円表記などカルチャ指定が必要な場合はToString("C", culture)
を使う方法もあります。
日付の書式 {d:yyyy/MM/dd}
DateTimeのフォーマット
DateTimeやDateOnlyも書式指定で整形できます。
using System;
class Program
{
static void Main()
{
DateTime d = new DateTime(2025, 1, 23, 14, 5, 6);
Console.WriteLine($"日付(年月日): {d:yyyy/MM/dd}");
Console.WriteLine($"時刻(時:分): {d:HH:mm}");
Console.WriteLine($"カスタム: {d:yyyy年M月d日(ddd) HH:mm:ss}");
}
}
日付(年月日): 2025/01/23
時刻(時:分): 14:05
カスタム: 2025年1月23日(木) 14:05:06
整形と文字列の混在
文中に自然に溶け込ませる
通常の文字列と式・書式を自由に混在できます。
using System;
class Program
{
static void Main()
{
string user = "Mika";
double score = 92.3;
DateTime when = DateTime.Now;
Console.WriteLine($"[{when:HH:mm}] {user} さんのスコアは {score:0.0} 点です。よくできました!");
}
}
[14:05] Mika さんのスコアは 92.3 点です。よくできました!
エスケープと特殊な書き方
中かっこを表示する {{ }} と }}
{ と } 自体を出したいとき
補間で使う波かっこは、そのままでは表示できません。
表示したい場合は{{
と}}
に二重化します。
using System;
class Program
{
static void Main()
{
Console.WriteLine($"波かっこを表示 {{ と }} の例");
Console.WriteLine($"JSONっぽい出力: {{\"name\":\"Taro\"}}");
}
}
波かっこを表示 { と } の例
JSONっぽい出力: {"name":"Taro"}
ダブルクォートや改行の扱い
通常の文字列(エスケープ使用)
普通の文字列リテラルでは、引用符は"
、改行は\n
で表します。
Console.WriteLine($"引用符は \" で表します。\n次の行です。");
引用符は " で表します。
次の行です。
@逐語的文字列(エスケープ最小化)
@を付けるとバックスラッシュや改行をそのまま書けます(ただし"
は""
と2連続で表現)。
Console.WriteLine(@$"C:\Users\Taro\Docs\report.txt
ダブルクォートは "" で書きます。");
C:\Users\Taro\Docs\report.txt
ダブルクォートは " で書きます。
$と@の組み合わせ $@”…” @$”…” の使いどころ
パスや複数行に最適
$と@は順序に関係なく同時に使えます($@"..."
と @$"..."
は同じ意味)。
Windowsパスや複数行テンプレートに便利です。
using System;
class Program
{
static void Main()
{
string user = "Taro";
string file = "report";
// バックスラッシュや改行をそのまま書けて、{...}の補間も使える
string path = $@"C:\Users\{user}\Docs\{file}.txt";
Console.WriteLine(path);
string multi = @$"
ユーザー: {user}
ファイル: {file}.txt
保存先 : C:\Users\{user}\Docs
";
Console.WriteLine(multi);
}
}
C:\Users\Taro\Docs\report.txt
ユーザー: Taro
ファイル: report.txt
保存先 : C:\Users\Taro\Docs
初心者がつまずきやすいポイント
nullを補間したときの表示
nullは空文字として出力される
補間でnullを挿入すると、空文字として扱われます。
ただしnullに対してメソッドやプロパティへアクセスすると例外です。
using System;
class Program
{
static void Main()
{
string s = null;
int? n = null;
// null は空文字として出力(間に何も表示されない)
Console.WriteLine($"文字列:null→[{s}] 数値:null→[{n}]");
object o = null;
// Console.WriteLine($"これは例外: {o.ToString()}"); // NullReferenceException
Console.WriteLine($"安全な書き方: {o?.ToString() ?? "(null)"}");
}
}
文字列:null→[] 数値:null→[]
安全な書き方: (null)
補間内のメソッド呼び出しは簡潔に
可読性を保つコツ
{…}の中に長い処理を書くと読みづらくなります。
副作用のある呼び出しも避け、事前に変数へ格納しましょう。
// 悪い例: 長いロジックを直書き
Console.WriteLine($"結果: {items.Where(x => x.IsActive).Select(x => x.Price).Average():0.00}円");
// 良い例: 先に計算してから補間
var avg = items.Where(x => x.IsActive).Select(x => x.Price).Average();
Console.WriteLine($"結果: {avg:0.00}円");
余計な空白や末尾スペースに注意
望まない空白の混入
リテラルに含めた空白はそのまま出力されます。
気づかない末尾スペースや改行が混入しないよう、行末や逐語的文字列の先頭・末尾に注意します。
// 末尾にスペースが1つ含まれている → そのまま出力に出る
Console.WriteLine($"[{ "Hello" }] "); // ← ここにスペース
// Trimで不要な空白を除去する方法
string raw = $@" { "Hello" }
";
Console.WriteLine($"[{raw.Trim()}]");
[Hello]
[Hello]
まとめ
文字列補間は、可読性と保守性を大きく高めるC#の基本機能です。
{変数}の埋め込みから、{式}、{値:書式}の整形まで一貫して書け、Console.WriteLineなど日常的な出力コードをすっきりさせます。
C# 6以降で利用でき、$ と @ の組み合わせや中かっこのエスケープ、nullの扱いなどの注意点を押さえれば、実務でもすぐに役立ちます。
今日から$”…”を積極的に使い、読みやすく安全な文字列処理を書いていきましょう。