C# では、標準リテラル文字列と逐語的リテラル文字列という 2 種類のリテラル文字列がサポートされています。
標準リテラル文字列は、"hello" のように 0 個以上の文字を二重引用符で囲んで指定し、単純なエスケープ シーケンス (タブ文字に対する \t など) でも、16 進数および Unicode のエスケープ シーケンスでも含むことができます。
逐語的リテラル文字列は、@ 文字、二重引用符、0 個以上の文字、および閉じる二重引用符で構成されています。@"hello" は逐語的リテラル文字列の簡単な例です。逐語的リテラル文字列では、区切り記号の間の文字は、逐語的に解釈されます。ただし、quote-escape-sequence だけは例外です。特に、単純なエスケープ シーケンス、16 進数および Unicode のエスケープ シーケンスは、逐語的リテラル文字列では処理されません。逐語的リテラル文字列は、複数の行にわたることができます。
- string-literal:
- regular-string-literal
verbatim-string-literal - regular-string-literal:
- " regular-string-literal-charactersopt "
- regular-string-literal-characters:
- regular-string-literal-character
regular-string-literal-characters regular-string-literal-character - regular-string-literal-character:
- single-regular-string-literal-character
simple-escape-sequence
hexadecimal-escape-sequence
unicode-escape-sequence - single-regular-string-literal-character:
- " (U+0022)、\ (U+005C)、および new-line-character を除く任意の文字
- verbatim-string-literal:
- @" verbatim -string-literal-charactersopt "
- verbatim-string-literal-characters:
- verbatim-string-literal-character
verbatim-string-literal-characters verbatim-string-literal-character - verbatim-string-literal-character:
- single-verbatim-string-literal-character
quote-escape-sequence - single-verbatim-string-literal-character:
- " を除く任意の文字
- quote-escape-sequence:
- ""
regular-string-literal-character 内の円記号 (\) の後には、'、"、\、0、a、b、f、n、r、t、u、U、x、v のいずれかの文字を指定する必要があります。それ以外の場合は、コンパイル エラーが発生します。
次に例を示します。
string a = "hello, world"; // hello, world
string b = @"hello, world"; // hello, world
string c = "hello \t world"; // hello world
string d = @"hello \t world"; // hello \t world
string e = "Joe said \"Hello\" to me"; // Joe said "Hello" to me
string f = @"Joe said ""Hello"" to me"; // Joe said "Hello" to me
string g = "\\\\server\\share\\file.txt"; // \\server\share\file.txt
string h = @"\\server\share\file.txt"; // \\server\share\file.txt
string i = "one\r\ntwo\r\nthree";
string j = @"one
two
three";
これらは、さまざまなリテラル文字列の例です。最後のリテラル文字列 j は、複数の行にまたがる逐語的リテラル文字列の例です。引用符の間にある文字は、改行文字などの空白記号を含めて、そのまま維持されます。
16 進値のエスケープ シーケンスで指定できる 16 進数字の個数は可変であるため、リテラル文字列 "\x123" には、123 という 16 進値の 1 個の文字が含まれます。12 という 16 進値の文字に続けて 3 という文字を含む文字列を作成するには、"\x00123" または "\x12" + "3" と記述します。
string-literal の型は string です。
リテラル文字列ごとに新しい文字列インスタンスが作成されるとは限りません。同じアセンブリ内の複数のリテラル文字列が文字列等値演算子 (7.9.7 を参照) によって等しくなっている場合、これらのリテラル文字列は同じ文字列インスタンスを参照します。たとえば、次のようなプログラムを考えます。
class Test
{
static void Main() {
object a = "hello";
object b = "hello";
System.Console.WriteLine(a == b);
}
} この例の 2 つのリテラルは同じ文字列インスタンスを参照しているため、出力は True になります。