C# 命名空间的快速检查

3

好的,这里有SystemSystem.Web。那么这暗示的结构是正确的吗:

namespace System
{
    // all of the outer namespace members

    namespace Web
    {
        // all of the inner members
    }
}

当一个命名空间嵌套在另一个命名空间中时,只有使用父/外部命名空间的using指令并不会自动引入子/嵌套命名空间。换句话说:

using System;

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

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

我只是想确认一下我是否正确理解了这个问题。

5个回答

3

System.Web被声明为:

namespace System.Web
{
    public class HttpContext {}
}

然而,实际上可以声明一个子名称空间:
namespace System
{
    namespace Web
    {
        public class HttpContext {}
    }
}

我从未见过这样的东西,但语法允许它,并且效果相同。在这两种情况下,HttpContext 的命名空间是 System.Web.HttpContext

即使是第二个示例,using System; 也不会导入子命名空间,只会导入该命名空间中定义的 类型


啊,所以它是一个独立的命名空间? - Major Productions
我认为这并没有什么区别。 - Dave Van den Eynde
@KevinM1:如果是那样的话,是的。但实际上并没有什么区别,请查看我的详细回答。 - Daniel Hilgarth

2
您可以嵌套命名空间,任何using指令只会授予您访问所引用的特定命名空间中定义的成员的权限。
因此,以您的示例为例:
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

可能会使用 WebApplication.ModelsWebApplication.Controllers 命名空间。

我想不出一个很好的例子,可以嵌套命名空间,但可能有很好的理由。 不过,在我看来,这将被视为例外。


被选为点符号澄清的答案。 - Major Productions
我认为命名空间与“引用”或“访问”没有任何关系,但这只是我的看法。 - Dave Van den Eynde

1

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


1
正如丹尼尔所说,“System.Web”没有被单独声明。 “System”和“System.Web”是两个不相关的命名空间。
这就是为什么你的代码示例“new HttpContext()”不起作用的原因 - 因为“HttpContext”根本不在“System”命名空间中。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接