はじめに
LINE botの開発をしていて、外部APIから取得したデータをもとにLINEメッセージの返信用文章を作成するところの書き方を最初以下のように書いていて、なんだか見栄えが悪いなと思っていました。
messageText =
$"「{lineEvent.Message.Text}」の海況情報です。\n" +
$"\n" +
$"【天気】\n" +
$"{seaCondition.Weather}\n" +
$"【気温】\n" +
$"{seaCondition.Temp} ℃\n" +
$"【風速】\n" +
$"{seaCondition.WindSpeed} m/s\n" +
$"【風向き】\n" +
$"{seaCondition.WindDirection}\n" +
$"【降水量】\n" +
$"{seaCondition.Rainfall} ㍉\n" +
$"【潮名】\n" +
$"{seaCondition.Title}\n" +
$"【日の出】\n" +
$"{seaCondition.Rise}\n" +
$"【日の入】\n" +
$"{seaCondition.Set}\n" +
$"【干潮時刻/水位】\n" +
$"{seaCondition.FirstEddTime}/{seaCondition.FirstEddCm} cm\n" +
$"{seaCondition.SecondEddTime}/{seaCondition.SecondtEddCm} cm\n" +
$"【満潮時刻/水位】\n" +
$"{seaCondition.FirstFloodTime}/{seaCondition.FirstFloodCm} cm\n" +
$"{seaCondition.SecondFloodTime}/{seaCondition.SecondtFloodCm} cm\n" +
$"\n" +
$"潮汐情報の観測港名:{seaCondition.HarborName}";
生文字列リテラル
C#11.0から追加された構文に、生文字列リテラルというのがあることを知りました。
https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/tokens/raw-string
たとえば複数行の文字列を、文字列リテラルとして宣言したい場合。
改行して表示する、みたいなことをやる場合はエスケープシーケンスを書いて改行できるようにして…といった面倒くさい書き方をしなければいけなかったところ、以下のように書くことで、エスケープを全く使うことなく複数行のテキストをそのまま書けるようになるというものです。
var text = """
C:\path\to\file
He said "Hello"
""";
上記のように書くことで、リテラルの内容と出力内容をそのまま一致させてくれます。
インデントも自動で調整してくれるため、コードのレイアウトを気にすることなく書けるのもうれしいポイントですね。
ちなみにこの中に変数を仕込みたい場合は、いつもやってる頭に「$」をつける書き方にもう一つドルマークをつけ足すことで、必要な波かっこの数を増やすことができます。
一番上に書いたLINEメッセージの返信用文章を、生文字リテラルを用いて書くと以下のようになります。
messageText = $$"""
「{{lineEvent.Message.Text}}」の海況情報です。
【天気】
{{seaCondition.Weather}}
【気温】
{{seaCondition.Temp}} ℃
【風速】
{{seaCondition.WindSpeed}} m/s
【風向き】
{{seaCondition.WindDirection}}
【降水量】
{{seaCondition.Rainfall}} ㍉
【潮名】
{{seaCondition.Title}}
【日の出】
{{seaCondition.Rise}}
【日の入】
{{seaCondition.Set}}
【干潮時刻/水位】
{{seaCondition.FirstEddTime}}/{{seaCondition.FirstEddCm}} cm
{{seaCondition.SecondEddTime}}/{{seaCondition.SecondtEddCm}} cm
【満潮時刻/水位】
{{seaCondition.FirstFloodTime}}/{{seaCondition.FirstFloodCm}} cm
{{seaCondition.SecondFloodTime}}/{{seaCondition.SecondtFloodCm}} cm
潮汐情報の観測港名:{{seaCondition.HarborName}}
""";
本当に文字通り「そのまま」書いて出力できるのがめちゃくちゃ便利だな、と思いました。
おわりに
コード内にSQLやJSONを埋め込むことがよくあると思いますが、そういう時にも使うとよいのかなと思います。
なによりエスケープ地獄から解放されるのが超ありがたいですね。