@ (C# リファレンス)@ (C# Reference)

特殊文字 @ は、逐語的識別子として機能します。The @ special character serves as a verbatim identifier. これは次の目的に使用できます。It can be used in the following ways:

  1. C# のキーワードを識別子として使用できるようにする。To enable C# keywords to be used as identifiers. コード要素のプレフィックスとして @ 文字を使用すると、その要素はC# のキーワードではなく、識別子としてコンパイラに解釈されます。The @ character prefixes a code element that the compiler is to interpret as an identifier rather than a C# keyword. 次の例では、@ 文字を使用して、for ループで使用する for という識別子を定義しています。The following example uses the @ character to define an identifier named for that it uses in a for loop.

    string[] @for = { "John", "James", "Joan", "Jamie" };
    for (int ctr = 0; ctr < @for.Length; ctr++)
    {
       Console.WriteLine($"Here is your gift, {@for[ctr]}!");
    }
    // The example displays the following output:
    //     Here is your gift, John!
    //     Here is your gift, James!
    //     Here is your gift, Joan!
    //     Here is your gift, Jamie!
    
  2. 文字列リテラルを逐語的に解釈することを示す。 To indicate that a string literal is to be interpreted verbatim. このインスタンス内の @ 文字は、逐語的文字列リテラルを定義します。 The @ character in this instance defines a verbatim string literal. 単純なエスケープ シーケンス (バック スラッシュの "\\" など)、16 進数のエスケープ シーケンス (大文字 A の "\x0041" など)、Unicode のエスケープ シーケンス (大文字 A の "\u0041" など) は、リテラルに解釈されます。Simple escape sequences (such as "\\" for a backslash), hexadecimal escape sequences (such as "\x0041" for an uppercase A), and Unicode escape sequences (such as "\u0041" for an uppercase A) are interpreted literally. 引用符のエスケープ シーケンス ("") だけは、リテラルに解釈することはできません。一重引用符が生成されます。 Only a quote escape sequence ("") is not interpreted literally; it produces a single quotation mark. また、逐語的な補間文字列の場合、中かっこエスケープ シーケンス ({{}}) は文字どおり解釈されません。単一の中かっこ文字が生成されます。Additionally, in case of a verbatim interpolated string brace escape sequences ({{ and }}) are not interpreted literally; they produce single brace characters. 次の例では、2 つの同じファイル パスを定義しています。一方は通常の文字列リテラルを使用して、もう一方は 逐語的文字列リテラルを使用して定義しています。 The following example defines two identical file paths, one by using a regular string literal and the other by using a verbatim string literal. これは、逐語的文字列リテラルの一般的な用途の 1 つです。This is one of the more common uses of verbatim string literals.

    string filename1 = @"c:\documents\files\u0066.txt";
    string filename2 = "c:\\documents\\files\\u0066.txt";
    
    Console.WriteLine(filename1);
    Console.WriteLine(filename2);
    // The example displays the following output:
    //     c:\documents\files\u0066.txt
    //     c:\documents\files\u0066.txt
    

    次の例は、同じ文字シーケンスを通常の文字列リテラルと 逐語的文字列リテラルで定義した場合の結果を示したものです。The following example illustrates the effect of defining a regular string literal and a verbatim string literal that contain identical character sequences.

    string s1 = "He said, \"This is the last \u0063hance\x0021\"";
    string s2 = @"He said, ""This is the last \u0063hance\x0021""";
    
    Console.WriteLine(s1);
    Console.WriteLine(s2);
    // The example displays the following output:
    //     He said, "This is the last chance!"
    //     He said, "This is the last \u0063hance\x0021"      
    
  3. 名前の競合がある場合に、コンパイラが属性を区別できるようにする。To enable the compiler to distinguish between attributes in cases of a naming conflict. 属性は Attribute の派生クラスです。An attribute is a class that derives from Attribute. 通常、その型の名前には Attribute サフィックスが含まれます。これは、コンパイラがその規則を強制していない場合でも同様です。Its type name typically includes the suffix Attribute, although the compiler does not enforce this convention. そのため属性は、完全な型名 (たとえば、[InfoAttribute]) か、短縮名 (たとえば、[Info]) によってコード内から参照できます。The attribute can then be referenced in code either by its full type name (for example, [InfoAttribute] or its shortened name (for example, [Info]). ただし、短縮された 2 つの属性型名が同じである場合、一方の型名に Attribute サフィックスが含まれていて、もう一方に含まれていないと、名前の競合が発生します。However, a naming conflict occurs if two shortened attribute type names are identical, and one type name includes the Attribute suffix but the other does not. たとえば、次のコードでは、InfoInfoAttribute のどちらの属性が Example クラスに適用されるかをコンパイラが判断できないため、コンパイルが失敗します。For example, the following code fails to compile because the compiler cannot determine whether the Info or InfoAttribute attribute is applied to the Example class. 詳細については、CS1614 を参照してください。See CS1614 for more information.

    using System;
    
    [AttributeUsage(AttributeTargets.Class)]
    public class Info : Attribute
    {
       private string information;
       
       public Info(string info)
       {
          information = info;
       }
    }
    
    [AttributeUsage(AttributeTargets.Method)]
    public class InfoAttribute : Attribute
    {
       private string information;
       
       public InfoAttribute(string info)
       {
          information = info;
       }
    }
    
    [Info("A simple executable.")] // Generates compiler error CS1614. Ambiguous Info and InfoAttribute. 
    // Prepend '@' to select 'Info'. Specify the full name 'InfoAttribute' to select it.
    public class Example
    {
       [InfoAttribute("The entry point.")]
       public static void Main()
       {
       }
    }
    

関連項目See also