C#を用いたアプリケーション開発において、文字列の操作は避けては通れない非常に重要な要素です。
かつては文字列の連結に + 演算子を使用したり、string.Format メソッドを利用したりするのが一般的でしたが、現在のC#開発では補間文字列(Interpolated Strings)がその主流となっています。
補間文字列は、コードの視認性を劇的に向上させ、保守性の高いプログラムを記述するために欠かせない機能です。
本記事では、補間文字列の基本構文から、高度な書式指定、最新のC#バージョンで追加された便利な機能までを詳しく解説します。
補間文字列の基本概念と構文
補間文字列とは、文字列リテラルの先頭に $ 記号を付けることで、文字列内に直接変数や式を埋め込むことができる機能です。
C# 6.0で導入されて以来、その直感的な記法により、多くの開発者に愛用されています。
基本的な書き方
補間文字列を使用するには、文字列の開始ダブルクォーテーションの直前に $ を記述します。
そして、文字列内の変数を埋め込みたい箇所を { } (中括弧)で囲みます。
using System;
public class Program
{
public static void Main()
{
string name = "Tech太郎";
int age = 25;
// 補間文字列を使用した例
string message = $"こんにちは、{name}さん。あなたは{age}歳ですね。";
Console.WriteLine(message);
}
}
こんにちは、Tech太郎さん。あなたは25歳ですね。
このように、変数を直接文字列の中に埋め込めるため、従来の string.Format のように「どのインデックスがどの変数に対応しているか」を目で追う必要がなくなります。
式の評価
{ } の中には、単なる変数だけでなく、メソッドの呼び出しや算術演算などの「式」を記述することも可能です。
using System;
public class Program
{
public static void Main()
{
double price = 1200;
double taxRate = 0.1;
// 中括弧の中で計算を行う
Console.WriteLine($"税込み価格は {price * (1 + taxRate)} 円です。");
// メソッド呼び出し
Console.WriteLine($"名前の長さは {name.Length} 文字です。");
}
}
従来の文字列操作手法との比較
補間文字列の利点をより深く理解するために、以前の主流であった手法と比較してみましょう。
1. 演算子による連結
最も原始的な方法は + 演算子による連結です。
string message = "名前は" + name + "、年齢は" + age + "です。";
この方法は、結合する項目が増えるほど コードが読みづらくなり、ミスを誘発しやすくなります。
また、内部的に複数の文字列オブジェクトが生成されるため、パフォーマンス面でも不利になることがあります。
2. string.Format メソッド
補間文字列が登場する前の標準的な方法です。
string message = string.Format("名前は{0}、年齢は{1}です。", name, age);
引数の順番とインデックス番号を一致させる必要があるため、引数が増えると「どの番号が何を指しているか」が分かりにくくなるという欠点があります。
補間文字列が優れている理由
補間文字列は、コンパイル時に適切に処理されるため、string.Format と同等以上のパフォーマンスを維持しつつ、圧倒的な可読性の高さを提供します。
コードを読んだ瞬間に最終的な文字列の形がイメージできるため、開発効率が大幅に向上します。
書式指定による高度な表示制御
補間文字列の真価は、中括弧内での書式指定(フォーマット)にあります。
数値や日付を特定の形式で表示したい場合に非常に便利です。
数値の書式指定
金額表示や小数点以下の桁数指定などを簡単に行えます。
書式を指定するには、変数の後に : (コロン)を付け、その後に書式指定子を記述します。
using System;
public class Program
{
public static void Main()
{
decimal salary = 250000.567m;
// 通貨形式(C)
Console.WriteLine($"給与: {salary:C}");
// 小数点第2位まで表示(F2)
Console.WriteLine($"数値: {salary:F2}");
// 3桁区切り(N)
Console.WriteLine($"区切り表示: {salary:N0}");
}
}
給与: ¥2500,01 (環境により記号は異なります)
数値: 250000.57
区切り表示: 250,001
日付と時刻の書式指定
DateTime 型の表示も自由自在です。
using System;
public class Program
{
public static void Main()
{
DateTime now = DateTime.Now;
// yyyy/MM/dd 形式
Console.WriteLine($"今日は {now:yyyy/MM/dd} です。");
// 時刻まで含める
Console.WriteLine($"現在は {now:HH時mm分ss秒} です。");
}
}
配置とアライメント(幅の調整)
表形式でデータを出力したい場合など、文字列の幅を固定したいことがあります。
その場合は、変数の後に , (コンマ)を付け、数値を指定します。
- 正の数値:右揃え
- 負の数値:左揃え
using System;
public class Program
{
public static void Main()
{
string[] items = { "Apple", "Banana", "Cherry" };
int[] prices = { 100, 50, 1000 };
for (int i = 0; i < items.Length; i++)
{
// 名前を10文字分で左揃え、価格を5文字分で右揃え
Console.WriteLine($"商品: {items[i], -10} | 価格: {prices[i], 5}円");
}
}
}
商品: Apple | 価格: 100円
商品: Banana | 価格: 50円
商品: Cherry | 価格: 1000円
特殊な文字列としての補間文字列
C#には、エスケープシーケンスを無視する「逐次形式文字列リテラル(@)」がありますが、これと補間文字列($)を組み合わせることも可能です。
補間逐次形式文字列($@)
パスの指定や複数行にわたる文字列を記述する際に非常に便利です。
string userName = "Admin";
// C# 8.0以降は $@ でも @$ でも可
string path = $@"C:\Users\{userName}\Documents";
string query = $@"
SELECT *
FROM Users
WHERE Name = '{userName}'";
エスケープが必要な特殊文字を直感的に扱えるため、SQLクエリの構築やファイルシステム操作で重宝します。
三項演算子を使用する場合の注意
補間文字列の中で三項演算子 (condition ? true : false) を使用する場合、注意が必要です。
コロン:が書式指定の開始と誤認されるため、三項演算子全体を丸括弧 ( ) で囲む必要があります。
int score = 85;
// 括弧がないとコンパイルエラーになる
string result = $"評価: {(score >= 80 ? "合格" : "不合格")}";
C# 11 以降の新機能:生文字列リテラル(Raw String Literals)
C# 11では、さらに強力な生文字列リテラルが導入されました。
これにより、ダブルクォーテーションや中括弧を多用するJSONやXMLなどの記述が劇的に楽になりました。
中括弧のエスケープ問題を解決する
従来の補間文字列で { 自体を表示したい場合は {{ と記述する必要がありました。
しかし、生文字列リテラルでは $ の数を増やすことで、補間に必要な中括弧の数を制御できます。
using System;
public class Program
{
public static void Main()
{
string title = "C# News";
// $$を使うことで、{{ }} が補間対象となり、単一の { } はそのまま文字として扱われる
string json = $$"""
{
"Title": "{{title}}",
"Published": "2026"
}
""";
Console.WriteLine(json);
}
}
この機能により、外部テンプレートやJSON構造をそのままコピー&ペーストして、必要な箇所だけを補間するといった作業が非常に容易になりました。
パフォーマンスと内部動作
補間文字列は非常に便利ですが、パフォーマンスに敏感な箇所で使用する際には、その内部動作を理解しておくことが重要です。
コンパイル時の展開
C# 9.0以前では、補間文字列は主に string.Format への呼び出しにコンパイルされていました。
これにより、値型(intなど)を埋め込む際に「ボックス化」が発生し、わずかながらオーバーヘッドが生じていました。
C# 10 以降の最適化
C# 10からは、DefaultInterpolatedStringHandler という構造体が導入されました。
これにより、多くの場合で文字列の割り当て(アロケーション)を最小限に抑え、ボックス化を回避できるようになりました。
コンパイラが賢く最適なコードを生成するため、現代のC#においては、パフォーマンスを理由に補間文字列を避ける必要はほとんどありません。
ただし、非常に巨大なループの中で大量の文字列結合を行う場合は、依然として StringBuilder の方が適しているケースもあります。
適材適所で使い分けましょう。
実践的な活用シーン
補間文字列は、日常的な開発のあらゆる場面で活躍します。
ロギング
例外メッセージや動作ログの作成において、コンテキスト情報を埋め込むのに最適です。
try
{
// 何らかの処理
}
catch (Exception ex)
{
logger.LogError($"ユーザー {userId} の処理中にエラーが発生しました。詳細: {ex.Message}");
}
デバッグ出力
Debug.WriteLine や Console.WriteLine で変数の状態を素早く確認する際、補間文字列は記述量を減らしてくれます。
UIへの表示
ユーザーに提示するメッセージを動的に生成する際、ローカライズの考慮が必要な場合を除き、補間文字列が第一選択となります。
まとめ
C#の補間文字列($””)は、単なるシンタックスシュガー(書きやすさのための構文)を超え、コードの品質と可読性を支える重要なインフラとなっています。
- 基本:
$"..."の形式で、中括弧{}を使って変数や式を埋め込む。 - 書式指定: コロン
:を使って数値や日付のフォーマット、コンマ,を使ってアライメントを制御する。 - 最新機能: C# 11の生文字列リテラル
$$"""..."""を活用し、複雑な構造の文字列をスマートに扱う。 - 効率: C# 10以降の最適化により、パフォーマンス面でも非常に優秀である。
これらの機能を使いこなすことで、あなたの書くC#コードはより清潔で、意図が伝わりやすいものになるはずです。
まだ古い結合方式を使っている箇所があれば、ぜひこの機会に補間文字列への書き換えを検討してみてください。
最新の言語機能を活用し、よりモダンで洗練されたプログラミングを目指しましょう。
