我想知道为什么我在命名空间范围之外定义它时可以访问类?
我对命名空间不太熟悉,我只是在学习,但我认为命名空间应该将我的所有类都包装到一个“盒子”中,并且它们可以在“盒子”(范围)内部相互访问。
代码示例:
class Point
{
public int X;
}
namespace ConsoleApplication12
{
class Program
{
static void Main(string[] args)
{
Point p = new Point();
p.X = 50;
Console.WriteLine(p.X);
Console.ReadLine();
}
}
}
感谢您的回答。
答案 0 :(得分:7)
命名空间 nothing 与访问权限有关。区分命名空间和程序集非常重要 - 它们通常密切相关,因为命名空间Foo.Bar
中的类型可能会在程序集Foo.Bar.dll
中,但是#39}一个惯例 - 它不是编译器或语言所关心的东西。
命名空间主要是"一个名称必须是唯一的空间"。换句话说,虽然在不同的命名空间中有两种称为Point
的类型很好,但在相同的中你不能有两种类型Point
命名空间。实际上,存在命名空间(IMO)的主要原因是我们不要所有人都必须在世界上的每一段.NET代码中使用完全唯一的名称。
您可以使用隐式Point
的{{1}}类,只要它在同一个程序集中声明即可。如果它在全局命名空间中(即根本没有在命名空间中声明)那么你不需要任何internal
指令来引用它 - using
指令的目的是允许您仅通过短名称引用不同命名空间的成员。
所以如果你有:
using
然后你可以访问它:
namespace Foo.Bar
{
public class Baz {}
}
或
namespace Other
{
class Test
{
Foo.Bar.Baz baz = new Foo.Bar.Baz();
}
}
如果类型是在" global"中定义的。命名空间,那么你就不需要// Allow anything in namespace Foo.Bar to be accessed by its
// short name
using Foo.Bar;
namespace Other
{
class Test
{
Baz baz = new Baz();
}
}
指令。从C#5语言规范部分3.8(命名空间和类型名称)中,它描述了类型名称查找过程:
如果前面的步骤不成功那么,对于每个命名空间N,从发生namespace-or-type-name的命名空间开始,继续每个封闭的命名空间(如果有的话),并以全局命名空间结束,评估以下步骤,直到找到实体
因此,在您的情况下,从using
方法中查找Point
,将首先检查Main
类型的ConsoleApplication12
,然后检查全局命名空间。
答案 1 :(得分:0)
要访问类,外部命名空间,您的类应该是公共的
public class Point
并且在您想要查看此类的命名空间中,您需要在使用顶部添加命名空间
using mynamespace.external;
比你可以访问你的班级