Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# global::在.Net设计器文件中的含义是什么?_C#_Namespaces - Fatal编程技术网

C# global::在.Net设计器文件中的含义是什么?

C# global::在.Net设计器文件中的含义是什么?,c#,namespaces,C#,Namespaces,这是一个问题,我已经有一段时间了,但从来没有真正抽出时间来问 在VisualStudio生成的许多设计器文件中,一些变量的前缀是global::有人能解释一下这意味着什么,这个前缀的作用以及我应该在哪里使用它吗?来自 当左标识符为全局标识符时, 搜索正确的标识符 从全局命名空间开始 前缀表示全局名称空间。以下是一个例子: namespace Bar { class Gnat { } } namespace Foo { namespace Bar { class Gnat { }

这是一个问题,我已经有一段时间了,但从来没有真正抽出时间来问

在VisualStudio生成的许多设计器文件中,一些变量的前缀是global::有人能解释一下这意味着什么,这个前缀的作用以及我应该在哪里使用它吗?

来自

当左标识符为全局标识符时, 搜索正确的标识符 从全局命名空间开始


前缀表示全局名称空间。以下是一个例子:

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内部标准。