Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#类中的@namespace字段是什么?_C#_Syntax_Field_Reserved Words - Fatal编程技术网

C#类中的@namespace字段是什么?

C#类中的@namespace字段是什么?,c#,syntax,field,reserved-words,C#,Syntax,Field,Reserved Words,我在浏览,发现了一件奇怪的事: /// <summary> /// The namespace that the rule is contained within. /// </summary> private string @namespace; // [...] internal Rule(string name, string @namespace, string checkId, string context, bool warning) : this(nam

我在浏览,发现了一件奇怪的事:

/// <summary>
/// The namespace that the rule is contained within.
/// </summary>
private string @namespace;

// [...]

internal Rule(string name, string @namespace, string checkId, string context, bool warning) : this(name, @namespace, checkId, context, warning, string.Empty, null, true, false)
{
    Param.Ignore(name, @namespace, checkId, context, warning);
}
//
///包含规则的命名空间。
/// 
私有字符串@名称空间;
// [...]
内部规则(字符串名称、字符串@namespace、字符串checkId、字符串上下文、bool警告):此规则(名称、@namespace、checkId、上下文、警告、字符串.空、空、真、假)
{
Param.Ignore(name、@namespace、checkId、context、warning);
}

这是什么东西?它是否只是一个简单的字段,其中at符号用于指示它是一个字段,而不是
名称空间
关键字?如果是这样,at符号可以用于任何保留字(例如
@dynamic
@using
,等等)?

是@符号可以放在保留字前面,以允许它们用作变量名

var @dynamic = ...
var @event = ....

事实上,我从

中学到了这一点,以及其他一些东西,基本上是的。将@放在变量名前面可以阻止由于该变量名是关键字而发生的错误


是的,您可以使用
@
作为变量的
第一个也是唯一的第一个
字符。

正如其他人回答的那样,确切地说,您可以使用保留关键字,只要您在前面加上“@”,但恕我直言,这不是一个好的开发实践。我宁愿只在机器生成的代码中使用它(例如,在我工作的公司,我们有一个将Java代码转换为C#的工具;因为在Java中,“event”不是保留字,我们的Java源代码可能包含这样的标识符)

最好的


Adriano

此技术通常与自动代码生成相结合,因为可能会生成目标语言中的关键字标识符,例如,如果Xml模式运行代码生成以生成C#类,则该模式可能具有称为“事件”的属性。这是一个C#关键字,因此代码生成器可以使用“@event”

将下划线(或任何其他字符)放在前面有什么区别?@adrianm:我发现的区别是,在使用反射时,
FieldInfo.Name
如果
@namespace
将是“namespace”,而
\u namespace
的名称将是“u namespace”。不仅仅是保留字;任何标识符都可以以@开头。为什么?因为你不知道将来什么词会成为关键词。如果你是偏执狂,担心有一天我们会将“blah”变成上下文关键字,那么你可以说“int@blah;”,并确保即使我们添加blah运算符,你的代码也会继续编译。还要注意,字段的名称是“namespace”,而不是“@namespace”。@只告诉编译器“后面是一个名称,而不是一个关键字”。否则,它将被忽略。