【问题标题】:What is @namespace field in C# class? [duplicate]C# 类中的@namespace 字段是什么? [复制]
【发布时间】:2011-02-18 14:00:41
【问题描述】:

我在浏览the source code of StyleCop,发现了一件奇怪的事情:

/// <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);
}

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

【问题讨论】:

  • 不仅是保留字;您可以以@ 开头any 标识符。为什么?因为你不知道未来哪些词会成为关键词。如果您偏执并担心有一天我们会将“blah”变成上下文关键字,那么您可以说“int @blah;”并确保即使我们添加了 blah 运算符,您的代码也会继续编译。
  • 还要注意,该字段的名称是“namespace”,而不是“@namespace”。 @ 只是告诉编译器“后面的内容是名称,而不是关键字”。否则将被忽略。

标签: c# syntax field reserved-words


【解决方案1】:

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

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

我实际上是从 this question 那里了解到的,以及其他一些事情

【讨论】:

    【解决方案2】:

    基本上是的。将 @ 放在变量名前面会阻止由于该变量名是关键字而发生的错误。

    http://msdn.microsoft.com/en-us/library/x53a06bb(VS.71).aspx

    【讨论】:

    • 在前面加下划线(或任何其他字符)有什么区别?
    • @adrianm:我发现的不同之处在于,当使用反射时,FieldInfo.Name 如果@namespace 将是“命名空间”,而_namespace 的名称将是“_namespace”。
    【解决方案3】:

    是的,您可以使用@ 作为变量的first and only first 字符。

    【讨论】:

      【解决方案4】:

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

      最好的

      阿德里亚诺

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-03-08
          • 1970-01-01
          • 2016-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-09
          相关资源
          最近更新 更多