C#中的命名空间与Java和Python中的导入

Mar*_* S. 11 c# python java namespaces packages

在Java和Python世界中,您查看源文件并知道所有导入的来源(即您知道在哪个文件中定义了导入的类).例如:

在Java中:

import javafoo.Bar;

public class MyClass {
    private Bar myBar = new Bar();
}
Run Code Online (Sandbox Code Playgroud)

您立即看到Bar-class是从javafoo导入的.因此,Bar被宣布进入/javafoo/Bar.java

在Python中

import pythonbaz
from pythonfoo import Bar

my_bar = Bar()
my_other = pythonbaz.Other()
Run Code Online (Sandbox Code Playgroud)

很明显,Bar来自pythonfoo包,而Other显然来自pythonbaz.

在C#中(如果我错了,请纠正我):

using foo
using baz
using anothernamespace
...

public class MyClass
{
    private Bar myBar = new Bar();
}
Run Code Online (Sandbox Code Playgroud)

两个问题:
1)我如何知道Bar-class的声明位置?它来自命名空间foo,或者bar,还是anothernamespace?(编辑:使用Visual Studio)

2)在Java中,包名称对应于目录名称(或者,它是一种非常强大的约定).因此,当您看到类来自哪个包时,您就知道它在文件系统中的目录.

在C#中,似乎没有命名空间的这种约定,或者我错过了什么?那么,我如何知道要查看的目录和文件(没有Visual Studio)?(在确定该类来自哪个命名空间之后).

编辑澄清:我知道Python和/或Java允许通配符导入,但这些语言中的"文化"对它们不满(至少在Python中,在Java中我不确定).此外,在Java IDE中通常可以帮助您创建最小的导入(如下面的Mchl.)

Jon*_*eet 7

1)嗯,你也可以用Java做同样的事情:

import java.util.*;
import java.io.*;

...

InputStream x = ...;
Run Code Online (Sandbox Code Playgroud)

是否InputStream来自java.utiljava.io?当然,您可以选择不使用该功能.

现在,理论上我意识到这意味着当你用文本编辑器查看时,你无法分辨出C#中的类型来源......但在实践中,我并不认为这是一个问题.多久,你实际上是在寻找的代码,并且不能使用Visual Studio?

2)当然,您也可以在.NET中使用相同的约定 - 我也这样做,虽然我没有空目录上链...所以如果我创建一个默认命名空间为XY的项目,然后X.Y.Foo就会进入Foo.cs,而XYZBar会进入Z\Bar.cs

这也是Visual Studio默认执行的操作 - 如果您创建子文件夹,它将使用基于项目默认值和文件夹结构的命名空间创建新类.

当然,您也可以在任何旧文件中声明类型 - 但大多数人会遵循声明具有相应文件名的类型的常规惯例.在泛型使委托声明更少之前,我曾经有一个Delegates.cs包含特定命名空间的所有委托声明的文件(而不是拥有一堆单声明文件)但是现在这不是问题.