好的,有System
和System.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
}
}
只是想看看我是否真的正确理解了这一点。
System.Web 声明为:
namespace System.Web
{
public class HttpContext {}
}
但是,可以实际声明一个子命名空间:
namespace System
{
namespace Web
{
public class HttpContext {}
}
}
我从未见过这样的东西,但语法允许它并且效果是一样的。在这两种情况下,HttpContext
的命名空间都是 System.Web.HttpContext
。
即使使用第二个示例,using System;
也不会导入子命名空间,只会导入该命名空间中定义的类型。
您可以嵌套命名空间,任何 using
指令都只会授予对所引用的特定命名空间中定义的成员的访问权限。
所以从你的例子中:
namespace System
{
// all of the outer namespace members
namespace Web
{
// all of the inner members
}
}
引用System
将授予您访问外部命名空间成员的权限,引用System.Web
将授予您访问所有内部命名空间成员的权限。
但这是非典型的,通常命名空间仅在文件中定义一次。 点表示法通常遵循文件夹或项目结构,因此嵌套的文件如下:
网页应用 -模型 - 我的模型.cs -控制器 - 我的控制器.cs
可能使用 WebApplication.Models
和 WebApplication.Controllers
的命名空间。
我想不出一个想要嵌套命名空间的好例子,但可能有一个很好的理由。 但是,我认为,这将被视为该规则的例外。
,using 指令只允许在没有命名空间限定符的情况下使用该命名空间中声明的类型。不会自动包含嵌套命名空间。
正如丹尼尔所说,System.Web
不是单独声明的。 System
和 System.Web
是两个独立的命名空间,在技术上不相关。
这就是为什么您的new HttpContext()
代码示例不起作用的原因 - 因为HttpContext
根本不在System
命名空间中。
关于复合命名空间的常见混淆。这是微软关于它的一篇很棒的文章:http://msdn.microsoft.com/en-us/library/ms973231.aspx