2013-02-22 58 views
67

在C#中,我经常在自动生成的代码中看到global::。这不是我曾经用过的自己,所以我不知道它的目的是什么。有人可以解释这个吗?什么是全球::?

+1

http://stackoverflow.com/questions/3552763/why-use-global-keyword-in-net – 2013-02-22 10:51:49

+2

从msdn:http://msdn.microsoft.com/en-us/library/c3ay4x3d.aspx – 2013-02-22 10:52:46

回答

59

全球是指全局命名空间,它可以用来解决问题,让你可以重新定义类型。例如:

class foo 
{ 
    class System 
    { 

    } 

} 

如果你使用一种系统,其中,将在Foo类进行局部范围,你可以使用:

global::System.Console.WriteLine("foobar"); 

访问全局命名空间。

using System; 

class Foo 
{ 
    public void baz() 
    { 
     Console.WriteLine("Foo 1"); 
    } 
} 

namespace Demo 
{ 
    class Foo 
    { 
     public void baz() 
     { 
      Console.WriteLine("Foo 2"); 
     } 
    } 

    class Program 
    { 
     protected static global::Foo bar = new global::Foo(); 

     static void Main(string[] args) 
     { 
      bar.baz(); // would write Foo 1 to console as it refers to global scope 
      Foo qux = new Foo(); 
      qux.baz(); // would write Foo 2 to the console as it refers to the Demo namespace 
     } 
    } 
} 
+0

如果我有一个带有全局名称空间前缀的类的自动生成的类,并且该类名为Foo,那么会发生什么?我有一个我创建的类,也称为Foo,它也没有名称空间? – 2013-02-22 11:07:04

+0

如果自动生成的类以全局名称空间为前缀并且名为Foo,则global将引用全局名称空间中的类。在任何名称空间中只能有一个具有相同名称的定义。如果您要从另一个名称空间内创建类的实例,从而为Foo定义了另一个含义,则它将占用本地最多的作用域。请参阅编辑 – chrisw 2013-02-22 11:19:20

17

这表明根命名空间的某个时候,必要的前缀。

它经常加入到生成的代码,以避免名称冲突与用户代码。

例如,假设您有一个名为System的课程,但您希望使用System.String。您可以使用global::System.String来区分。

相信::来自C++使用它的一个命名空间分隔。

在实践中,我从来没有使用过,除了在生成代码。请注意,您也可以通过使用别名来解决一些冲突。例如using String = System.String;

12

global上下文关键字,当谈到::运算之前,指的是全局命名空间,这是任何C#程序的默认命名空间,否则命名。

global::符告诉编译器开始寻找从根本上命名空间或类起动。您将在系统生成的代码中看到它,以便代码始终有效。这样,如果您的当前命名空间下有一个名称空间,与代码尝试访问的顶级命名空间相同,则不会有冲突。

例如,假设您有命名空间A和命名空间B以及命名空间B.A,如果我在命名空间B.A中编写需要引用命名空间A中的类的代码,而没有全局::我无法获取它。如果我引用A.classname,编译器将在B.A.中查找classname。使用global ::我可以告诉它在global :: A.classname中查找classname,它会在适当的位置找到classname。

+12

如果您从网上资源获取内容,请提供适当的归属信息:[MSDN](http://msdn.microsoft.com/zh-cn/com/en-us/library/cc713620.aspx)和[什么是C#中的全局关键字](http://blog.dmbcllc.com/what-is-the-global-keyword-in-csharp/) – Bart 2013-02-26 10:47:07

+2

k .. @巴特感谢您的评论当我下次回答时,我会记住。但为什么这是downvote? – coder 2013-02-26 11:29:30

+0

那不是我的。 – Bart 2013-02-26 11:34:20