逐字文本 - @
在变量、属性和字符串文本中
@
特殊字符用作原义标识符。 通过以下方式使用它:
指示将原义解释字符串。
@
字符在此实例中定义原义标识符 。 简单转义序列(如代表反斜杠的"\\"
)、十六进制转义序列(如代表大写字母 A 的"\x0041"
)和 Unicode 转义序列(如代表大写字母 A 的"\u0041"
)都将按字面解释。 只有引号转义序列 (""
) 不会按字面解释;因为它生成一个双引号。 此外,如果是逐字内插字符串,大括号转义序列({{
和}}
)不按字面解释;它们会生成单个大括号字符。 下面的示例分别使用常规字符串和原义字符串定义两个相同的文件路径。 这是原义字符串的较常见用法之一。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
下面的示例演示定义包含相同字符序列的常规字符串和原义字符串的效果。
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"
使用 C# 关键字作为标识符。
@
字符可作为代码元素的前缀,编译器将把此代码元素解释为标识符而非 C# 关键字。 下面的示例使用@
字符定义其在for
循环中使用的名为for
的标识符。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!
使编译器在命名冲突的情况下区分两种属性。 属性是派生自 Attribute 的类。 其类型名称通常包含后缀 Attribute,但编译器不会强制进行此转换。 随后可在代码中按其完整类型名称(例如
[InfoAttribute]
)或短名称(例如[Info]
)引用此属性。 但是,如果两个短名称相同,并且一个类型名称包含 Attribute 后缀而另一类型名称不包含,则会出现命名冲突。 例如,由于编译器无法确定将Info
还是InfoAttribute
属性应用于Example
类,因此下面的代码无法编译。 有关详细信息,请参阅 CS1614。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' ([@Info("A simple executable.")]). Specify the full name 'InfoAttribute' to select it. public class Example { [InfoAttribute("The entry point.")] public static void Main() { } }