2003年08月08日
川俣晶の縁側ソフトウェア技術雑記 total 25042 count

C#で改行を含む長い文字列定数を書く方法

Written By: 川俣 晶連絡先

 ソースコードに、改行を含む長い文字列を直接書き込んでしまいたい事例はいろいろあります。たとえば、XML文書を処理するプログラムのテストを書く場合に、テスト対象のXML文書を直接ソース中に書き込んでしまいたい場合などがあります。

 このような場合、多くのプログラム言語では、1つの文字列定数に改行を含めることができるとしても、1行が長くなりすぎるため、複数の文字列定数に分割する必要がありました。

 たとえば、以下のように書いてやる必要があったわけです。(特定のプログラム言語のソースを想定したものではありません)

"abcdefghijklmnopqrstuvexyz\r\n"

+ "abcdefghijklmnopqrstuvexyz\r\n"

+ "abcdefghijklmnopqrstuvexyz\r\n"

 もう使っていないのでうろ覚えですが。C言語はストリングコンカチネーションと言ったかどうかよく覚えていませんが、複数に分かれた文字列リテラルを結合してくれる機能があったような気もします。そういう機能があればハッピーではありますが。

 C#の場合はどうでしょうか。

 うかつな話ですが、ある重要な事実に今まで気付いていませんでした。逐語的リテラル文字列には改行を含めることができるということです。

 たとえば、以下のソースを実行させたときの出力が分かりますか?

using System;

class Class1
{
    [STAThread]
    static void Main(string[] args)
    {
        Console.Write(@"first line
next line
");
    }
}

 出力は、「first line改行next line改行」となります。

 C#には、標準リテラル文字列と逐語的リテラル文字列という2種類の文字列リテラルがあります。標準リテラル文字列とは普通に使っている""でくくるもの。逐語的リテラル文字列とは、先頭に@を付けて""でくくるものです。逐語的リテラル文字列を使うと、円記号(バックスラッシュ)をエスケープしなくても書き込めて便利なので、ファイルのパスを書くときなどに多用していましたが、実は改行も有効な文字列の一部として書き込めたわけですね。

 これまで気付かなかったとはうかつでしたが、これはなかなかクールな機能だと思います。ますますC#で快適にプログラムを書けそうです。