文字列の開始、終了のダブルクオーテーション「"」が3つある """ の文字列、生文字列リテラルの利用 - C#

文字列の開始、終了のダブルクオーテーション「"」が3つある文字列の表記について紹介します。

概要

C#のコード中に、ダブルクオーテーション「"」が3つある文字列のコードを見かけることがあります。 この書式は、「生文字列リテラル (Raw string literals)」と呼ばれる文字列の表現です。
この記事では、生文字列リテラルの動作について紹介します。

書式

"""[文字列]"""
書式例では、" の個数は3つで記述していますが、3つ以上であれば、生文字列リテラルとして動作します。

動作

生文字列リテラル内では記述した文字がそのままの文字列として表現されます。

記述例

string text = """しろくまアイス""";
string value = """""もみじリンゴまんじゅう""""";

プログラム例

UI

下図のフォームを作成します。
今回のデモでは、[button4]と[button5]を利用します。

コード

以下のコードを記述します。
namespace RawString
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      string str = """ぺんぎんクッキー"なめらか"な味わい""";
      textBox1.Text += str;
    }

    private void button2_Click(object sender, EventArgs e)
    {

    }
  }
}

解説

下記コードが生文字列リテラルです。文字列内に「"」が記述されていますが、文字列を閉じる動作にはならず文字の「"」として表現できます。
  string str = """ぺんぎんクッキー"なめらか"な味わい""";

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[button1]をクリックします。テキストがテキストボックスに表示されます。


補足

なお、「""」を生文字列リテラルで記述した場合もそのままの文字で表現されます。
    private void button2_Click(object sender, EventArgs e)
    {
      string str = """らくだキャラメル""ミルキー""な口どけ""";
      textBox1.Text += str;
    }


生文字列リテラル内で「"""」を表現したい場合

生文字列リテラル内で、「"""」を表現したい場合に下記のコードを記述すると、文字列を閉じる動作になり、コンパイルエラーになります。
    private void button3_Click(object sender, EventArgs e)
    {
      string str = """かるがもサブレ"""サクサク"""な食感""";
      textBox1.Text += str;
    }


この場合は、生文字列リテラルの開始のダブルクオーテーションを3つ以上で記述します。
    private void button3_Click(object sender, EventArgs e)
    {
      string str = """""かるがもサブレ"""サクサク"""な食感""""";
      textBox1.Text += str;
    }

@で始まる文字列 Verbatim 文字列リテラルとの違い

Verbatim 文字列リテラルも文字列中に記述した文字がそのまま表現できますが、文字列内でダブルクオーテーション(")を表現する場合に、 ダブルクオーテーションを2つ記述する("")必要があります。そのため、ダブルクオーテーションを多用するコードを文字列で表現する場合に 記述が冗長になります。

下記のコードでは、"部分で、文字列を閉じる動作になってしまいます。
  string stra = @"ぺんぎんクッキー"なめらか"な味わい";

次のコードの記述に修正します。
  string stra = @"ぺんぎんクッキー""なめらか""な味わい";

複数行での生文字列リテラルとVerbatim 文字列リテラルとの違いは次のセクションを参照して下さい。

改行のある複数行 生文字列リテラル

UI


コード

namespace RawString
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void button4_Click(object sender, EventArgs e)
    {
      string str = """
        <myscript>
          <head title="コンテンツページ"/>
          <body>
            <text>コンテンツです</text>
          </body>
        </myscript>
        """;
      textBox1.Text += str;
    }

    private void button5_Click(object sender, EventArgs e)
    {
      string str = @"
        <myscript>
          <head title=""コンテンツページ""/>
          <body>
            <text>コンテンツです</text>
          </body>
        </myscript>
        ";
      textBox1.Text += str;
    }
  }
}

解説

生文字列リテラルは複数行の場合、インデントや最初の行の空行が無いものとみなされます。インデントは文字列終了の"""が基準となり、インデントがないものとして扱われます。

一方、Verbatim 文字列リテラルでも複数行の記述ができますが、最初の行の空行やインデントも含めてすべて文字列として表現されるため、 ソースコード上のインデントも文字列の空白になります。

生文字列リテラルの場合は、Visual Studioのコードエディタを利用すると、基準となる位置に白色の縦線が表示されます。


"""の位置を変更すると、基準の位置が変化することも確認できます。


一方で生文字列リテラル終了行より深いインデントに"""が記述されている場合はコンパイルエラーになります。

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[button4]をクリックします。テキストボックスに下図の結果が表示されます。
コード中のインデントや先頭の空行が削除された状態の表示になります。


[button5]をクリックします。テキストボックスに下図の結果が表示されます。
コード中のインデントや先頭の空行も含まれた文字列の内容がテキストボックスに表示されます。



著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2022-11-30
iPentec all rights reserverd.