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

时间:2017-07-21 07:52:13

标签: c# class namespaces

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

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

代码示例:

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();
        }
    }
}

感谢您的回答。

2 个答案:

答案 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;

比你可以访问你的班级