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