C# global::在.Net设计器文件中的含义是什么?
这是一个问题,我已经有一段时间了,但从来没有真正抽出时间来问 在VisualStudio生成的许多设计器文件中,一些变量的前缀是global::有人能解释一下这意味着什么,这个前缀的作用以及我应该在哪里使用它吗?来自 当左标识符为全局标识符时, 搜索正确的标识符 从全局命名空间开始C# global::在.Net设计器文件中的含义是什么?,c#,namespaces,C#,Namespaces,这是一个问题,我已经有一段时间了,但从来没有真正抽出时间来问 在VisualStudio生成的许多设计器文件中,一些变量的前缀是global::有人能解释一下这意味着什么,这个前缀的作用以及我应该在哪里使用它吗?来自 当左标识符为全局标识符时, 搜索正确的标识符 从全局命名空间开始 前缀表示全局名称空间。以下是一个例子: namespace Bar { class Gnat { } } namespace Foo { namespace Bar { class Gnat { }
前缀表示全局名称空间。以下是一个例子:
namespace Bar {
class Gnat { }
}
namespace Foo {
namespace Bar {
class Gnat { }
}
class Gnus {
Bar.Gnat a; // Foo.Bar.Gnat
global::Bar.Gnat b; // Bar.Gnat
}
}
请注意成员a可能是如何无意中引用Foo.Bar.Gnat类的。要避免这种情况,请使用global::prefix。全局命名空间限定符允许您访问全局(“空”)命名空间中的成员 如果要调用非限定类型(例如MyClass.DoSomething()而不是MyNamespace.MyClass.DoSomething()),则假定它位于当前命名空间中。那么,如何限定该类型,使其位于全局/空命名空间中 此代码示例(控制台应用程序)应说明其行为:
using System;
namespace MyNamespace
{
public class Program
{
static void Main(string[] args)
{
MessageWriter.Write(); // writes "MyNamespace namespace"
global::MessageWriter.Write(); // writes "Global namespace"
Console.ReadLine();
}
}
// This class is in the namespace "MyNamespace"
public class MessageWriter
{
public static void Write()
{
Console.WriteLine("MyNamespace namespace");
}
}
}
// This class is in the global namespace (i.e. no specified namespace)
public class MessageWriter
{
public static void Write()
{
Console.WriteLine("Global namespace");
}
}
global::namespace限定符在自动生成中使用,以防止通过嵌套命名空间进行类型解析时发生冲突。这并不能回答为什么的问题。生成的代码使用名称空间中声明的类型,并且仍然使用global::is。@Ihar:global以类似的方式用于指定名称空间不应是子名称空间…否-问题有三个问题:这意味着什么(解释),前缀的作用(解释)以及我应该在哪里使用它(一旦你理解了另外两点,你就会知道了。)你的问题——“为什么在设计器文件中使用它?”不是原始提问者要求的。@lhar:oops-稍早一点点击add。正如Arjan所说,这是为了确保没有子命名空间的类。例如,如果设计器在命名空间MyProject.Library中的自动生成类中引用了类型System.Resources.ResourceManager,则其前缀为global的原因是以防万一确实有一个类型MyProject.Library.System.Resources.ResourceManager。否则,设计师会不小心使用第二个类型。@rob,你的观点是正确的。Calanus接受了答案,所以我认为他的好奇心得到了满足。但在生成的代码中并非如此。你见过全局名称中的类型吗.net designer文件中引用的空间?使用global::qualifier的原因是为了防止在搜索嵌套命名空间时发生类型解析冲突。它与生成的代码有何关系?在.net designer类中通常不会引用来自全局命名空间的类型。代码生成器希望引用类Bar.Gnat。如果代码是在Foo命名空间内生成的类Foo.Bar.Gnat被引用,除非使用了global::前缀。代码生成器希望保护生成的代码不受此错误的影响。这有点偏执,但却是正确的做法,可能是Microsoft内部标准。