[英]In C#, why can't I test if a event handler is null anywhere outside of the class that it's defined?
[英]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.