什么是全局::?


Answers:


104

全局是指全局名称空间,它可以用于解决问题,从而可以重新定义类型。例如:

class foo
{
    class System
    {

    }

}

如果要在foo类的本地作用域中使用System,则可以使用:

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
        }
    }
}

如果我有一个自动生成的类,该类的类以全局名称空间为前缀,并且该类称为Foo,我创建了一个也称为Foo并且没有名称空间的类,该怎么办?
2013年

如果自动生成的类以全局名称空间为前缀并且称为Foo,则global将引用全局名称空间中的类。任何名称空间中只能有一个具有相同名称的定义。如果要从另一个命名空间中创建该类的实例,从而为Foo定义另一个含义,则它将采用最局部的作用域。参见编辑
chrisw

26

这是有时需要的前缀,指示根名称空间。

通常将其添加到生成的代码中,以避免名称与用户代码冲突。

例如,假设您有一个名为的类System,但是随后您想使用System.String。您可以global::System.String用来区分。

我相信::C ++来自C ++,它用作命名空间分隔符。

实际上,除了生成代码外,我从未使用过它。请注意,您还可以通过使用别名来解决一些冲突。例如using String = System.String;


14

global上下文关键字位于::运算符之前时,它表示全局名称空间,它是所有C#程序的默认名称空间,否则未命名。

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

例如,如果我在名称空间BA中编写的代码需要引用名称空间A中的类,而没有global ::,则说您拥有名称空间A,名称空间B和名称空间BA,而我没有办法使用它。如果引用A.classname,则编译器将在具有global ::的BA中查找类名,然后告诉它在global :: A.classname中查找类名,并且它将在正确的位置找到类名。


15
如果您从在线资源中获取内容,请足够友好地提供适当的署名:MSDNC#中的全局关键字是什么
Bart 2013年

3
k .. @ Bart谢谢您的评论下次回答时我会牢记。
编码器

3

global::命名空间和其标识是不是大多数人的想法。它不是应用程序中创建的所有内容的通用标识符,该标识符位于应用程序定义的名称空间之一之外并附加到某个全局根。

如果在顶级命名空间之外创建类或类型,则将自动假定其为GLOBAL命名空间的一部分,并且可由global::应用程序或程序集中的所有文件中的标识符访问。实际上,这些名称通常仅在该文件的已编译LOCAL范围内,但可通过global::标识符进行访问。

如果您在aspx.cs文件中创建顶级类或名称空间,则可以通过global::该文件中的全局名称空间对其进行访问。但是,如果您键入global::另一个文件,则该类和名称空间在全局名称空间中不存在。但是,如果您在class.cs文件中创建相同的类或名称空间,则这些项目可通过global::和在全局名称空间以及所有文件在本地范围中用于所有其他文件。为什么?

事实证明,global::这实际上是对文件作用域下的顶级LOCAL名称以及程序集共享的GLOBAL名称的引用(例如在典型的ASP.NET项目中App_Code类文件中可能会编译的名称)。

我发现这非常令人困惑且不一致,因为这global::意味着要访问在应用程序中创建的与全局名称空间绑定的顶级名称空间和类型。在所有文件中,默认情况下,诸如“系统”之类的文件都绑定到全局名称空间,但是自定义文件可能取决于该文件的范围,也可能不取决于该文件的范围。这就是为什么全局标识符还具有解决对本地根作用域名称的引用的辅助作用的原因。

您可以通过在应用程序的各个部分中创建顶级名称空间和类来进行测试,然后使用它global::来查看它可以从应用程序的不同部分访问全局名称空间中的哪些内容,以及哪些不能访问。它无法访问的文件仅在该文件中明确分配给“本地全局范围”,这global::有助于您在命名冲突中进行访问。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.