好的,有System
和System.Web
。我是否正确,这表明结构是:
namespace System
{
// all of the outer namespace members
namespace Web
{
// all of the inner members
}
}
当命名空间嵌套在另一个命名空间中时,只有{/ 1}}指令与父/外命名空间 不会自动引入子/嵌套命名空间?换句话说:
using
试着看看我是否真的理解这一点。
答案 0 :(得分:3)
System.Web声明为:
namespace System.Web
{
public class HttpContext {}
}
但是,实际上可以声明子命名空间:
namespace System
{
namespace Web
{
public class HttpContext {}
}
}
我从未见过这样的东西,但语法允许它,效果是一样的。在这两种情况下,HttpContext
的命名空间都是System.Web.HttpContext
。
即使使用第二个示例,using System;
也不会导入子命名空间,只导入该命名空间中定义的 types 。
答案 1 :(得分: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.Models
和WebApplication.Controllers
的命名空间。
我想不出一个很好的例子,你想要嵌套名称空间,但可能有一个很好的理由。但是,在我看来,它将被视为该规则的例外。
答案 2 :(得分:1)
是的,using指令只允许在没有命名空间限定符的情况下使用在该命名空间中声明的类型。嵌套的命名空间不会自动包含在内。
答案 3 :(得分:1)
正如丹尼尔所说,System.Web
并未单独宣布。 System
和System.Web
是两个独立的名称空间,在技术上是不相关的。
这就是为什么new HttpContext()
的代码示例不起作用的原因 - 因为HttpContext
根本不在System
命名空间中。
答案 4 :(得分:1)
这是关于复合命名空间的常见混淆。下面是一篇关于它的微软文章:http://msdn.microsoft.com/en-us/library/ms973231.aspx