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

2022-09-04 20:14:46

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

在爪哇:

import javafoo.Bar;

public class MyClass {
    private Bar myBar = new Bar();
}

您立即看到 Bar 类是从 javafoo 导入的。因此,Bar 在/javafoo/Bar.java

在 Python 中

import pythonbaz
from pythonfoo import Bar

my_bar = Bar()
my_other = pythonbaz.Other()

在这里,很明显Bar来自pythonfoo包,而Other显然来自pythonbaz。

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

using foo
using baz
using anothernamespace
...

public class MyClass
{
    private Bar myBar = new Bar();
}

两个问题:
1)我如何知道Bar类的声明位置?它是否来自命名空间 ,或者 , 或者 ?(编辑:不使用Visual Studio)foobaranothernamespace

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

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

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


答案 1

1)好吧,你也可以在Java中做同样的事情:

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

...

InputStream x = ...;

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

现在,从理论上讲,我意识到这意味着当你使用文本编辑器进行查找时,您无法分辨C#中类型的来源...但在实践中,我不认为这是一个问题。你有多少次实际查看代码而无法使用Visual Studio?

2)当然,您也可以在.NET中使用相同的约定 - 我确实如此,尽管我没有空目录在链上...因此,如果我正在创建一个默认命名空间为X.Y的项目,那么它将在,X.Y.Z.Bar 将在X.Y.FooFoo.csZ\Bar.cs

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

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


答案 2

1)你是对的。乍一看,没有“直接”的方法来知道你的类来自哪里,但是,正如你所说,你可以在IDE中跳转到它。但是以这种方式声明类只是执行此操作的最短方法。如果你愿意,并假设你的Bar类来自Foo类,你可以声明它

private foo.Bar myBar = new foo.Bar();

通过这种方式,它将有助于在第一眼就知道你的课程来自哪里。

2)当您添加对类的引用时,添加引用窗口将为您提供要查找的信息。如果您想知道它们在声明后的来源,可以在“引用”树节点下找到一个名为“解决方案资源管理器”的窗口,您可以在其中找到这些信息。您可以将其设置为始终可见(默认情况下为常可见)


推荐