为什么在C#中要使用全局关键字?

57

我想了解为什么您可能希望使用global::前缀。在下面的代码中,ReSharper将其识别为冗余并可以删除:

alt text


7
@John,只是好奇——想了解为什么代码生成过程会使用它。 - Paul Fryer
44
告诉别人忽略他们的好奇心是可怕的建议。你到底希望任何人如何学习呢?我认为这是一个很棒的问题——我自己经常也想同样的事情,但一直没问出口。 - Jake
22
@John - 不确定如何回应你的评论“你没有更好的事情可做吗”。我花时间尝试成为一个更好的开发者和编程员。我想问一下,难道你没有更好的事情可做,而要留下毫无帮助的无意义评论吗? - Paul Fryer
8
保罗说得好。像约翰这样的人,应该被禁止访问社区网站,因为这样的评论会极大地削弱其他人的精神动力。 - Everything Matters
6
好奇心和猫,记住了。你没有更好的事情可做吗? 这是我在问答论坛中见过的最愚蠢的评论。 - Ed Graham
显示剩余6条评论
3个回答

67

关键字global::会导致编译器将以全局命名空间开头的名称绑定到全局命名空间,而不是当前上下文中。在存在一个与全局命名空间中同名的可绑定成员并且需要使用全局成员的情况下,就需要使用它。

例如:

class Test {
  class System {}
  public void Example() {
    System.Console.WriteLine("here"); // Error since System binds to Test.System
    global::System.Console.WriteLine("here"); // Works
}

对应的MSDN页面有更多示例(包括上述示例)


53

在生成的代码中最好使用全局命名空间前缀,这是为了避免在您的命名空间中存在类似名称的类型。

如果您在自己的命名空间内创建了一个名为System.Diagnostics.DebuggerNonUserCodeAttribute的类型,则会发现ReSharper不再建议使用global::。 代码生成器只是想避免与您自己的类型名称冲突。


短小简洁的回答。 - CreativeManix

2
“全局上下文关键字”在 :: 运算符之前使用时,指的是全局命名空间。这是任何 C# 程序的默认命名空间,否则未命名。”

Shami Qureshi,如果你要逐字复制答案,你至少需要提到来源。虽然你的回答实际上并没有回答问题,但我已经编辑了它,包括你复制的URL。 - johnnyRose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接