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
    }
}

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

4

5 回答 5

3

System.Web 声明为:

namespace System.Web
{
    public class HttpContext {}
}

但是,实际上可以声明一个子命名空间:

namespace System
{
    namespace Web
    {
        public class HttpContext {}
    }
}

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

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

于 2012-12-05T15:58:47.023 回答
2

可以嵌套命名空间,并且任何using指令只会授予对您引用的特定命名空间中定义的成员的访问权限。

所以从你的例子中:

namespace System
{
    // all of the outer namespace members

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

引用System将授予您对外部命名空间成员的访问权限,而引用System.Web将授予您对所有内部命名空间成员的访问权限。

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

Web应用程序
    - 楷模
        - MyModel.cs
    - 控制器
        - MyController.cs

可能使用WebApplication.Models和的命名空间WebApplication.Controllers

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

于 2012-12-05T16:08:39.223 回答
1

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

于 2012-12-05T16:01:41.720 回答
1

正如丹尼尔所说,System.Web没有单独声明。System并且System.Web是两个在技术上不相关的独立命名空间。

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

于 2012-12-05T16:02:03.257 回答
1

这是关于复合命名空间的常见混淆。这里有一篇关于它的 microsoft 的精彩文章:http: //msdn.microsoft.com/en-us/library/ms973231.aspx

于 2012-12-05T16:04:12.290 回答