在C#中,只对命名空间使用using指令.在下面这个例子中的C++中,必须要做一个include然后使用命名空间,为什么它不像C#中那样?
#include <iostream>
int main()
{
using namespace std;
cout << "Hello world!" << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
因为C#中的编译器与C++的工作方式非常不同.
快速版本 - C#以(模糊)类似的方式使用引用,因为C++使用链接器和转发声明.C++需要前向声明,因此它可以将每个源文件编译为转换单元,然后将所有这些单元链接在一起.C#编译器加载引用程序集的代码,然后立即编译整个程序集,因此不需要那些类型的前向声明.
长版 -
C++
在C++中,如果要使用代码,则必须将其添加到链接器,并提供前向声明.头文件包含前向声明,包含文件只是将该文件复制/粘贴到源文件中.
这是因为C++有一个称为翻译单元的中间步骤,并生成目标文件.链接器粘在一起.
在您的示例中,#include <iostream>提供前向声明,并通过包含头文件(以前称为"iostream.h",但现在称为"iostream")来实现.此头文件被复制/粘贴到源代码中(以及文件包含的所有头文件,等等).这一切都被编译成一个翻译单元(目标文件),链接到C++运行时(以及可能是C运行时,可能还有其他),并转换为可执行文件.
C#
在C#中,如果要使用代码,则添加对项目或构建文件的引用,或者只是将C#文件添加到同一项目中.不需要前向声明,但您必须引用代码,或者在当前程序集中包含代码的另一个源文件.
C#中间没有翻译单元.它只生产组件.
当您引用System.dll时,您已经拥有了可用的代码.您不必提供前向声明,因此不需要包含任何标头.
都
您可以使用using关键字将整个命名空间拉入当前范围.在C++中,您可以调用using namespace std;.在C#中,您调用using System;
然后你可以做以下事情:
std::cout << "test1\n";
cout << "test2\n";
Run Code Online (Sandbox Code Playgroud)
要么
System.Console.WriteLine("test1");
Console.WriteLine("test1");
Run Code Online (Sandbox Code Playgroud)
我忘记你是否可以在C++中,但在C#中你也可以别名命名空间:
using Ser = System.Runtime.Serialization;
...
class Blah : Ser.ISerializable {
Run Code Online (Sandbox Code Playgroud)
或别名类型:
using ISer = System.Runtime.Serialization.ISerializable;
...
class Blee : ISer {
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
332 次 |
| 最近记录: |