おもちゃラボ

Unityで遊びを作ってます

C#のヒアドキュメントで変数を展開する

Rubyには、文字列を見た目通りのフォーマットに整えてくれるヒアドキュメントという書き方があります。C#では見た目通りの入力ができる文字列のことを逐次的リテラル文字列と呼びます。

逐次的リテラル文字列とは

書き方は簡単で文字列の先頭に@(アットマーク)をつけるだけです。逐次的リテラル文字列はよくパスの指定などで使われます。通常バックスラッシュはエスケープシークエンスとみなされるため、パスを書く場合は次のように、バックスラッシュを2個重ねる必要がありました。

".¥¥hoge¥¥hoge¥¥hoge.txt"

逐次的リテラル文字列を使えば、見た目通りの文字列が得られるので次のように書くことができます。

@".¥hoge¥hoge¥hoge.txt"

また、複数行にわたって次のように文字列を書くこともできます。

@"1    2     3
  tama
       joro
             kuro
"

もちろん出力結果も見た目通りになります。

逐次的リテラル文字列の中で変数を使う

逐次的リテラル文字列の中で変数の値を表示したい時にはどうすれば良いでしょうか。例えば次のように普通に変数名を書いてしまうと、当然変数名がそのまま表示されてしまいます。

int point = 80;
Console.WriteLine(@"your score is point. GREAT!");

出力
your score is point. GREAT!

逐次的リテラル文字列の中で変数の値を展開したい時には、stringクラスのFormatメソッドを使えばOKです。

int point = 80;
Console.WriteLine(string.Format(@"your score is {0}. GREAT!"), point);

出力
your score is 80. GREAT!

逐次的リテラル文字列の時点では「your score is {0}. GREAT!」と出力され、Formatメソッドによってpoint変数が代入される、という仕組みです。ちょっとトリッキーですね。

C# 6以降なら文字列挿入が使える

そこでC# 6では、文字列挿入(string interpolation)という文法(シンタックスシュガー)が導入されました。これは文字列の中で直接変数を展開する構文で、$(ドルマーク)に続けて次のように書くことで{}内の変数を自動的に展開してくれます。

int point = 80;
Console.WriteLine($"your score is {point}. GREAT!");

出力
your score is 80. GREAT!

逐次的リテラル文字列と文字列挿入の合わせ技で、次のように「$@」と書くこともできます。

Console.WriteLine($@"your score is {point}.GREAT!");

このあたり、便利になったと見るのか、カオスになったとみるのか・・・