为什么我可以访问在命名空间之外定义的类?

Jak*_*use 2 c# namespaces class

我想知道为什么我在命名空间范围之外定义它时可以访问类?

我对命名空间不太熟悉,我只是在学习,但我认为命名空间应该将我的所有类都包装到一个"盒子"中,并且它们可以在"盒子"(范围)内部相互访问.

代码示例:

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢你的回答.

Jon*_*eet 7

命名空间与访问无关.区分命名空间和程序集很重要 - 它们通常密切相关,因为命名空间中的类型Foo.Bar很可能是汇编Foo.Bar.dll,但这是一种约定 - 它不是编译器或语言所关心的.

命名空间主要是"名称必须唯一的空间".换句话说,虽然它的罚款有两种类型称为Point在不同的命名空间,你不能有两种类型称为Point同一个命名空间.实际上,存在命名空间(IMO)的主要原因是我们并不是所有人都必须在世界上的每一段.NET代码中使用完全唯一的名称.

您可以使用Point隐式的类,internal只要它在同一个程序集中声明即可.如果它在全局命名空间中(即根本没有在命名空间中声明)那么你不需要任何using指令来引用它 - using指令的目的是允许你只是通过它们的短命引用不同命名空间的成员名称.

所以如果你有:

namespace Foo.Bar
{
    public class Baz {}
}
Run Code Online (Sandbox Code Playgroud)

然后你可以访问它:

namespace Other
{
    class Test
    {
        Foo.Bar.Baz baz = new Foo.Bar.Baz();
    }
}
Run Code Online (Sandbox Code Playgroud)

要么

// Allow anything in namespace Foo.Bar to be accessed by its
// short name
using Foo.Bar;

namespace Other
{
    class Test
    {
        Baz baz = new Baz();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果类型在"global"命名空间中定义,那么您就不需要该using指令.从C#5语言规范部分3.8(名称空间和类型名称)开始,它描述了类型名称查找过程:

如果前面的步骤不成功那么,对于每个名称空间N,从发生namespace-or-type-name的名称空间开始,继续每个封闭的名称空间(如果有的话),并以全局名称空间结束,以下步骤是评估直到找到实体

因此,在您的情况下,Point从您的Main方法中寻找,首先ConsoleApplication12检查一个Point类型,然后检查全局命名空间.