在 C# 中,仅对命名空间使用 using 指令。在 C++ 中,如下面的示例所示,必须执行包含然后使用命名空间,为什么它与 C# 中的不同?
#include <iostream>
int main()
{
using namespace std;
cout << "Hello world!" << endl;
return 0;
}
最佳答案
因为 C# 中的编译器与 C++ 的工作方式非常不同。
快速版本 - C# 使用引用的方式(模糊地)类似于 C++ 使用链接器和前向声明。 C++ 需要前向声明,以便它可以将每个源文件编译为翻译单元,然后将所有这些单元链接在一起。 C# 编译器加载引用程序集的代码,然后立即编译整个程序集,因此不需要这些类型的前向声明。
长版-
C++
在C++中,如果要使用代码,必须将其添加到链接器中,并提供前向声明。头文件包含前向声明,包含文件只需将该文件复制/粘贴到您的源文件中。
这是因为 C++ 有一个称为翻译单元的中间步骤,并生成目标文件。链接器将它们粘合在一起。
在您的示例中,#include <iostream>
提供前向声明,并通过包含头文件(以前称为“iostream.h”,但现在称为“iostream”)来实现。此头文件被复制/粘贴到您的源代码中(连同所有头文件该文件 包含,等等)。这一切都被编译成一个翻译单元(目标文件),链接到 C++ 运行时(可能还有 C 运行时,也许还有其他),并变成可执行文件。
C#
在 C# 中,如果您想使用代码,您可以添加对项目或构建文件的引用,或者只需将 C# 文件添加到同一项目即可。不需要前向声明,但您必须引用代码,或者在当前程序集中有另一个包含代码的源文件。
C# 没有中间步骤的翻译单元。它只生产组件。
当您引用 System.dll 时,您已经拥有可用的代码。您不必提供前向声明,因此不需要包含任何 header 。
两者
您可以使用 using
关键字将整个命名空间拉入当前范围。在 C++ 中,您调用 using namespace std;
.在 C# 中,您调用 using System;
然后你可以这样做:
std::cout << "test1\n";
cout << "test2\n";
或者
System.Console.WriteLine("test1");
Console.WriteLine("test1");
我忘记了在 C++ 中是否可以,但在 C# 中你也可以为命名空间起别名:
using Ser = System.Runtime.Serialization;
...
class Blah : Ser.ISerializable {
或别名类型:
using ISer = System.Runtime.Serialization.ISerializable;
...
class Blee : ISer {
关于c++ - 为什么在 C++ 中我需要在已经使用 import 指令之后使用命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4114431/