簡體   English   中英

為什么我可以訪問在命名空間之外定義的類?

[英]Why I can access class that is defined outside of namespace?

我想知道為什么我在命名空間范圍之外定義它時可以訪問類?

我不是很熟悉命名空間,我只是在學習,但我認為命名空間應該將我的所有類都包裝到一個'box'中,並且它們可以在'box'(范圍)內部相互訪問。

代碼示例:

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

謝謝你的回答。

命名空間與訪問無關 區分命名空間和程序集很重要 - 它們通常密切相關,在命名空間中的類型Foo.Bar很可能在程序集Foo.Bar.dll ,但這是一個約定 - 它不是編譯器或語言的東西關心。

命名空間主要是“名稱必須唯一的空間”。 換句話說,雖然它的罰款有兩種類型稱為Point在不同的命名空間,你不能有兩種類型稱為Point同一個命名空間。 實際上,存在命名空間(IMO)的主要原因是我們並不是所有人都必須在世界上的每一段.NET代碼中使用完全唯一的名稱。

您可以使用隱式internal Point類,只要它在同一個程序集中聲明即可。 如果它在全局命名空間中(即根本沒有在命名空間中聲明),那么你不需要任何using指令來引用它 - using指令的目的是允許你引用不同命名空間的成員他們的簡稱。

所以如果你有:

namespace Foo.Bar
{
    public class Baz {}
}

然后你可以訪問它:

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

要么

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

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

如果類型在“global”命名空間中定義,那么您只需要using指令即可。 從C#5語言規范部分3.8(名稱空間和類型名稱)開始,它描述了類型名稱查找過程:

如果前面的步驟不成功那么,對於每個名稱空間N,從發生namespace-or-type-name的名稱空間開始,繼續每個封閉的名稱空間(如果有的話),並以全局名稱空間結束,以下步驟是評估直到找到實體

因此,在您的情況下,從Main方法中查找Point ,首先檢查ConsoleApplication12是否為Point類型,然后是全局命名空間。

要訪問類,外部命名空間,您的類應該是公共的

public class Point

在您想要查看此類的命名空間中,您需要在使用之前添加命名空間

using mynamespace.external;

比你可以訪問你的班級

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM