什么是全球::?

Sac*_*nth 101 c#

在C#中,我global::经常在自动生成的代码中使用.这不是我曾经用过的东西,所以我不知道目的是什么.有人可以解释一下吗?

chr*_*isw 91

global指的是全局命名空间,它可用于解决可能重新定义类型的问题.例如:

class foo
{
    class System
    {

    }

}
Run Code Online (Sandbox Code Playgroud)

如果您要使用系统,它将在foo类中本地作用域,您可以使用:

global::System.Console.WriteLine("foobar");
Run Code Online (Sandbox Code Playgroud)

访问全局命名空间.

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Dre*_*kes 25

它是一个必要的前缀,表示根命名空间.

它经常被添加到生成的代码中,以避免与用户代码的名称冲突.

例如,假设你有一个叫做的类System,但是你想要使用它System.String.你可以global::System.String用来区分.

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

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


cod*_*der 12

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

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

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

  • 如果您从在线资源中获取内容,请善意提供正确的归因:[MSDN](http://msdn.microsoft.com/en-us/library/cc713620.aspx)和[什么是全局关键字in C#(http://blog.dmbcllc.com/what-is-the-global-keyword-in-csharp/) (13认同)
  • k .. @ Bart感谢您的评论我将在下次回答的时候记住这一点.但是为什么这是downvote? (2认同)