Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.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#名称空间的快速检查_C#_Namespaces - Fatal编程技术网

关于C#名称空间的快速检查

关于C#名称空间的快速检查,c#,namespaces,C#,Namespaces,好的,有System和System.Web。我的观点正确吗?这表明的结构是: namespace System { // all of the outer namespace members namespace Web { // all of the inner members } } 当一个名称空间嵌套在另一个名称空间中时,仅对父/外部名称空间使用指令不会自动引入子/嵌套名称空间?换言之: using System; public clas

好的,有
System
System.Web
。我的观点正确吗?这表明的结构是:

namespace System
{
    // all of the outer namespace members

    namespace Web
    {
        // all of the inner members
    }
}
当一个名称空间嵌套在另一个名称空间中时,仅对父/外部名称空间使用
指令不会自动引入子/嵌套名称空间?换言之:

using System;

public class Example
{
    public Example()
    {
        context1 = new HttpContext(); // won't work

        context2 = new System.Web.HttpContext(); // will work
    }
}

只是想看看我是否真的理解正确。

System.Web声明为:

namespace System.Web
{
    public class HttpContext {}
}
但是,可以实际声明子命名空间:

namespace System
{
    namespace Web
    {
        public class HttpContext {}
    }
}
我从未见过这样的东西,但语法允许,效果是一样的。在这两种情况下,
HttpContext
的名称空间都是
System.Web.HttpContext


即使在第二个例子中,
使用系统
不会导入子命名空间,只导入该命名空间中定义的类型。

是的,using指令只允许在不使用命名空间限定符的情况下使用该命名空间中声明的类型。嵌套的名称空间不会自动包含。

正如Daniel所说,
System.Web
不是单独声明的
System
System.Web
是两个独立的名称空间,在技术上是不相关的


这就是为什么
new HttpContext()
的代码示例不起作用的原因-因为
HttpContext
根本不在
系统
命名空间中。

这是关于复合命名空间的常见混淆。下面是microsoft的一篇关于它的优秀文章:

您可以嵌套名称空间,任何使用
指令的
都只会授予您所引用的特定名称空间中定义的成员的访问权限

从你的例子来看:

namespace System
{
    // all of the outer namespace members

    namespace Web
    {
        // all of the inner members
    }
}
引用
System
将授予您访问外部命名空间成员的权限,引用
System.Web
将授予您访问所有内部命名空间成员的权限

但这是不典型的,通常名称空间在文件中只定义一次。点符号通常遵循文件夹或项目结构,因此嵌套的文件如下:

WebApplication - Models - MyModel.cs - Controllers - MyController.cs 网络应用 -模型 -MyModel.cs -控制器 -MyController.cs 可能使用
WebApplication.Models
WebApplication.Controllers
的命名空间


我想不出一个很好的例子,你会想嵌套名称空间,但这可能是一个很好的理由。然而,在我看来,它将被视为规则的一个例外。

啊,所以它是一个独立的名称空间?我不认为这真的有什么区别。@KevinM1:在这种情况下,是的。但这真的没有什么区别,请看我的扩展答案。选择作为点符号澄清的答案。我不认为名称空间与“引用”或“访问”有任何关系,但那只是我自己。