如果没有定义命名空间,一个类会有啥命名空间

Posted

技术标签:

【中文标题】如果没有定义命名空间,一个类会有啥命名空间【英文标题】:What namespace will a class have if no namespace is defined如果没有定义命名空间,一个类会有什么命名空间 【发布时间】:2014-10-18 22:25:50 【问题描述】:

在 C# 中,如果我创建一个没有命名空间的类,我将在尝试实例化该类时使用什么命名空间?

例如,假设 main 是...

namespace NamespaceTests

    class Program
    
        static void Main(string[] args)
        

        
    

...并假设我的无命名空间类是...

public class test

    public string SayHello()
    
        return "Hello World!";
    

...并假设我有另一个同名的类,但具有默认命名空间...

namespace NamespaceTests

    public class test
    
        public string SayHello()
        
            return "Hello Moon...";
        
    

...我将如何修改 main 以包含无命名空间类的实例并调用“SayHello”来检索消息“Hello World!”?具体来说,我将如何完全限定类“test”的无命名空间实例,特别是考虑到我可能有另一个类也称为“test”但有一个命名空间,所以我需要区分......

【问题讨论】:

explicitly refer to a class without a namespace in C#的可能重复 【参考方案1】:

它在global namespace 中,可以这样引用:

var x = new global::test();

【讨论】:

感谢大卫 - 示例完美。您的回答是在@itsme86 前 10 秒 - 先生,奖励给您。例如 +1... 这解决了由于同名类而导致的模棱两可的引用。一个有命名空间,一个没有。它试图用命名空间调用一个并得到一个异常:错误 CS0117:'System.Web.Mvc.htmlHelperExtensions'不包含'RenderPartialViewToString的定义【参考方案2】:

未在命名空间中定义的类型将位于 global 命名空间中。

全局上下文关键字,当它出现在 :: 运算符之前时,指的是全局命名空间,它是任何 C# 程序的默认命名空间,否则未命名。

以下示例显示了如何使用全局上下文关键字 指定类 TestApp 定义在全局命名空间中:

C# class TestClass : global::TestApp  

【讨论】:

【参考方案3】:

除了上面的答案之外,需要注意的是,所有类型,无论其声明位置如何,都有一个“完全限定名称”,它从“global::”开始

来自“O'Relly. C# in a Nutshell”:

所有类型名称都在编译时转换为完全限定名称。中间语言 (IL) 代码不包含非限定名称或部分限定名称

【讨论】:

确实可以在 C# 中使用完全限定的对象进行编程并避免使用using 语句。 using 语句是纯粹的语法糖,它压缩代码以使其更易于阅读。当对具有相似名称的类存在很大程度的混淆时,完全限定类型并且不使用 using 语句以提高清晰度可能是有意义的。

以上是关于如果没有定义命名空间,一个类会有啥命名空间的主要内容,如果未能解决你的问题,请参考以下文章

Python中的命名空间是啥?

DOMDocument 命名空间有啥用?

std::literals::.. 作为内联命名空间有啥好处?

类、包、命名空间和模块之间有啥区别?

XSD:命名空间和默认命名空间有啥区别

命名空间的定义