【问题标题】:What does global:: mean in the .Net designer files?.Net 设计器文件中的 global:: 是什么意思?
【发布时间】:2009-07-10 07:43:36
【问题描述】:

这是一个我已经有一段时间了但实际上从来没有问过的问题......

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

【问题讨论】:

    标签: c# namespaces


    【解决方案1】:

    全局命名空间限定符允许您访问全局(“空”)命名空间中的成员。

    如果您要调用非限定类型(例如 MyClass.DoSomething() 而不是 MyNamespace.MyClass.DoSomething()),则假定它位于当前命名空间中。那么你如何限定类型说它在 global/empty 命名空间中呢?

    此代码示例(控制台应用程序)应说明其行为:

    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::。
    • @Ihar: Global 以类似的方式用于指定命名空间不应是子命名空间...
    • 不——这个问题问了三件事:这意味着什么(解释),这个前缀有什么作用(解释)以及我应该在哪里使用它(一旦你理解了其他两个,你就会知道点)。您的问题 - “为什么在设计器文件中使用它”不是由原始提问者提出的。
    • @lhar :哎呀 - 早点点击添加。正如 Arjan 所说,要添加的意思是确保没有带有子命名空间的类。例如如果设计者在命名空间 MyProject.Library 中的自动生成的类中引用类型 System.Resources.ResourceManager,那么它在其前面加上 global 前缀的原因是为了以防万一实际上存在类型 MyProject.Library.System.Resources.ResourceManager。否则设计者会无意中使用第二种类型。
    • @rob 好吧,你的观点是正确的。 Calanus 接受了答案,所以我认为他的好奇心得到了满足。但在生成的代码中并非如此。您是否见过 .net 设计器文件中引用的全局命名空间中的类型?使用 global:: 限定符的原因是为了防止在搜索嵌套命名空间时发生类型解析冲突。
    【解决方案2】:

    前缀表示全局命名空间。这是一个例子:

    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:: 前缀。

    【讨论】:

    • 它与生成的代码有什么关系? .net 设计器类中通常不会引用来自全局命名空间的类型。
    • 代码生成器想要引用类 Bar.Gnat。如果代码是在 Foo 命名空间内生成的,则引用类 Foo.Bar.Gnat,除非使用 global:: 前缀。代码生成器希望保护生成的代码免受此错误的影响。这有点偏执,但仍然是正确的做法,并且可能是 Microsoft 的内部标准。
    【解决方案3】:

    global:: 命名空间限定符用于自动生成,以防止通过嵌套命名空间进行类型解析时发生冲突。

    【讨论】:

      【解决方案4】:

      来自here

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

      【讨论】:

        猜你喜欢
        • 2013-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-28
        • 1970-01-01
        相关资源
        最近更新 更多