为啥在 C# 中使用 global 关键字?

Posted

技术标签:

【中文标题】为啥在 C# 中使用 global 关键字?【英文标题】:Why use the global keyword in C#?为什么在 C# 中使用 global 关键字? 【发布时间】:2011-04-02 22:31:39 【问题描述】:

我想了解您为什么要使用global:: 前缀。在以下代码中,ReSharper 将其标识为多余的,并且可以删除:

【问题讨论】:

@John,只是好奇 - 试图了解为什么它被代码生成过程使用。 @John-Saunders 告诉某人忽略他们的好奇心是可怕的建议。你究竟希望人们如何学习? @Paul-Fryer 我认为这是一个很好的问题 - 我自己也经常想知道同样的事情,但还没有来得及问。 @John - 不知道如何回复您的评论“您的时间没有更好的事情可做”。这段时间花在尝试成为更好的开发人员和程序员上。我会问你难道没有比留下对任何人都没有帮助的无意义的cmets更好的事情吗? 保罗说得好。应该禁止像 John 这样的人访问社区网站,因为这样的 cmets 会极大地削弱其他人的精神。 “好奇心和猫,记住了。你的时间没有更好的事情可做吗?”这是我在问答论坛上见过的最愚蠢的评论。 【参考方案1】:

关键字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页面还有几个例子(包括上面那个)

http://msdn.microsoft.com/en-us/library/c3ay4x3d.aspx

【讨论】:

【参考方案2】:

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

如果您创建一个名为System.Diagnostics.DebuggerNonUserCodeAttribute 的类型在您的命名空间内,您会注意到ReSharper 不再说不需要global::。代码生成器只是想避免与您自己的类型名称发生任何冲突。

【讨论】:

简短、简单、漂亮的答案【参考方案3】:

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

来源:https://msdn.microsoft.com/en-us/library/cc713620.aspx

【讨论】:

Shami Qureshi,如果您要逐字复制答案,您至少需要提及来源。尽管您的回答确实没有回答问题,但我已对其进行了编辑以包含您从中复制它的 URL。

以上是关于为啥在 C# 中使用 global 关键字?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C# 接口方法没有声明为抽象或虚拟的?

为啥我不能在 C# 中使用抽象静态方法?

C#“lock”关键字:为啥语法需要对象?

global用法

为啥可以在没有 new 关键字的情况下实例化结构?

C#中为啥使用字段封装