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

C# 为什么我可以访问在命名空间之外定义的类?,c#,class,namespaces,C#,Class,Namespaces,我想知道为什么在命名空间范围之外定义类时可以访问它 我对名称空间不是很熟悉,我只是在学习,但我认为名称空间应该将我的所有类包装到一个“盒子”中,它们可以在这个“盒子”(作用域)中相互访问 代码示例: class Point { public int X; } namespace ConsoleApplication12 { class Program { static void Main(string[] args) {

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

我对名称空间不是很熟悉,我只是在学习,但我认为名称空间应该将我的所有类包装到一个“盒子”中,它们可以在这个“盒子”(作用域)中相互访问

代码示例:

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

谢谢您的回答。

要访问命名空间之外的类,您的类应该是公共的

public class Point
在您希望看到这个类的名称空间中,您需要在usings的顶部添加名称空间

using mynamespace.external;
然后您就可以访问类了

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

名称空间主要是“名称必须唯一的空间”。换句话说,虽然在不同的命名空间中有两个名为
Point
的类型是可以的,但在同一命名空间中不能有两个名为
Point
的类型。事实上,名称空间存在(IMO)的主要原因是,我们不必在世界上的每一段.NET代码中都使用完全唯一的名称

您可以使用隐式
内部
类,只要它是在同一程序集中声明的。如果它在全局名称空间中(即根本不在名称空间中声明),那么您不需要任何
使用
指令来引用它-
使用
指令的目的是允许您仅通过短名称引用不同名称空间的成员

因此,如果你有:

namespace Foo.Bar
{
    public class Baz {}
}
然后,您可以通过以下方式访问:

namespace Other
{
    class Test
    {
        Foo.Bar.Baz baz = new Foo.Bar.Baz();
    }
}

如果该类型是在“全局”名称空间中定义的,那么您就不需要
using
指令。在C#5语言规范第3.8节(名称空间和类型名称)中描述了类型名称查找过程:

如果前面的步骤不成功,则对于每个名称空间N,从出现名称空间或类型名称的名称空间开始,继续执行每个封闭名称空间(如果有),并以全局名称空间结束,将计算以下步骤,直到找到实体


因此,在您的情况下,从
Main
方法中查找
,首先将检查
控制台应用程序12
是否有
类型,然后是全局名称空间。

您是否导入了点类所在的名称空间?@Balaguruntahanmarimuthu:
类不在名称空间中。这就是重点,不需要公开。只要访问代码在同一个程序集中,它就可以是内部的(默认值)。这听起来不错,但我想知道为什么我的代码可以工作,即使我没有这样做。我只是在我的名称空间之外定义了类,我仍然可以在我的名称空间内部创建该类的对象Namespace@JakubGause当前位置我不清楚的是为什么你认为它不应该起作用。大概您已经习惯于使用来自其他名称空间的类型。。。这只是全局名称空间。你为什么认为它会失败?对不起,我错了,正如我现在理解的,类点在同一个文件中。所以它会起作用。我假设,它位于具有不同名称空间的不同文件中。是的,我通常使用许多名称空间,并且不会超出它们。
// Allow anything in namespace Foo.Bar to be accessed by its
// short name
using Foo.Bar;

namespace Other
{
    class Test
    {
        Baz baz = new Baz();
    }
}