在C#中,我看到在自动生成的代码中经常使用global::。这不是我自己用过的东西,所以我不知道它的用途是什么。有人能解释一下吗?
发布于 2013-02-22 18:55:28
全局是指全局命名空间,它可以用来解决您可以重新定义类型的问题。例如:
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
}
}
}发布于 2013-02-22 18:52:03
它有时是一个必要的前缀,表示根名称空间。
它通常被添加到生成的代码中,以避免与用户代码的名称冲突。
例如,假设您有一个名为System的类,但随后您想要使用System.String。您可以使用global::System.String来区分。
我相信::来自C++,在那里它被用作名称空间分隔符。
实际上,除了在生成代码时,我从未使用过它。请注意,您还可以通过使用别名来绕过一些冲突。例如using String = System.String;
发布于 2013-02-22 18:59:54
当global上下文关键字出现在::运算符之前时,它引用全局命名空间,全局命名空间是任何C#程序的默认命名空间,否则将是未命名的。
global::说明符告诉编译器从根开始查找名称空间或类。您将在系统生成的代码中看到它,以便代码始终正常工作。这样,如果您的当前命名空间下有一个与代码试图访问的顶级命名空间相同的命名空间,就不会出现冲突。
例如,假设您有名称空间A、名称空间B和名称空间B.A。如果我在名称空间B.A中编写需要引用名称空间A中的类的代码,而没有global::我就无法访问它。如果我引用A.classname,编译器将在B.A中查找类名。使用global::我可以告诉编译器在global::A.classname中查找类名,它会在正确的位置找到类名。
https://stackoverflow.com/questions/15022441
复制相似问题