在C#中,我看到global::
经常在自动生成的代码中使用。这不是我曾经用过的东西,所以我不知道目的是什么。有人可以解释一下吗?
答案 0 :(得分:80)
global是指全局命名空间,它可用于解决可能重新定义类型的问题。例如:
class foo
{
class System
{
}
}
如果您要使用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
}
}
}
答案 1 :(得分:20)
这是一个必要的前缀,表示根命名空间。
它经常被添加到生成的代码中,以避免与用户代码发生名称冲突。
例如,假设您有一个名为System
的类,但之后您想使用System.String
。您可以使用global::System.String
来区分。
我相信::
来自C ++,它被用作命名空间分隔符。
在实践中,除了生成代码之外,我从未使用过它。请注意,您还可以通过使用别名来解决一些冲突。例如using String = System.String;
答案 2 :(得分:12)
global
contextual关键字,当它出现在::运算符之前时,引用全局命名空间,它是任何C#程序的默认命名空间,否则是未命名的。
global::
说明符告诉编译器开始从根开始查找命名空间或类。您将在系统生成的代码中看到它,以便代码始终有效。这样,如果你当前命名空间下的命名空间与代码试图访问的顶级命名空间相同,则不存在冲突。
例如,假设您有名称空间A和名称空间B以及名称空间B.A如果我在名称空间B.A中编写代码,需要引用名称空间A中的类,没有全局::我无法找到它。如果我引用A.classname,编译器将在B.A中查找类名。使用global ::我可以告诉它在global :: A.classname中查找classname,它会在正确的位置找到classname。
答案 3 :(得分:0)
global::
命名空间及其标识符并不是大多数人认为的。它不是在应用程序中定义的名称空间之一之外并附加到某个全局根目录的应用程序中创建的所有内容的通用标识符。
如果在顶级名称空间之外创建类或类型,则将自动假定其为GLOBAL名称空间的一部分,并可由应用程序或程序集中的所有文件中的global::
标识符进行访问。实际上,这些名称通常仅在该文件的已编译LOCAL范围内,但可以通过global::
标识符进行访问。
如果在aspx.cs文件中创建顶级类或名称空间,则可以通过global::
从该文件中的全局名称空间访问它。但是,如果在另一个文件中键入global::
,则该类和名称空间在全局名称空间中不存在。但是,如果您在class.cs文件中创建相同的类或名称空间,则这些项目可通过global::
在所有其他文件以及全局名称空间以及该文件的本地范围中使用。为什么?
事实证明,global::
实际上是对文件作用域下的顶级LOCAL名称以及程序集共享的GLOBAL名称的引用(例如在典型ASP.NET中可能在您的App_Code类文件中编译的名称)项目)。
我发现这非常令人困惑并且不一致,因为global::
意味着访问应用程序中创建的与全局名称空间绑定的顶级名称空间和类型。在所有文件中,默认情况下,诸如“系统”之类的文件都绑定到全局名称空间,但是自定义文件可能会也可能不会取决于该文件的范围。这就是为什么全局标识符还具有解决对本地根作用域名称的引用的次要作用的原因。
您可以通过在应用程序的某些部分中创建顶级名称空间和类,然后使用global::
来查看它可以从应用程序的不同部分访问全局名称空间中的哪些内容以及哪些不能访问它们,来进行测试。无法访问的文件仅在该文件中明确分配给“本地全局范围”,global::
可帮助您在命名冲突中进行访问。