程序结构Program Structure

本文内容

C# 中的关键组织结构概念包括程序命名空间类型成员程序集C# 程序由一个或多个源文件组成。程序声明类型,而类型则包含成员,并被整理到命名空间中。类型示例包括类和接口。成员示例包括字段、方法、属性和事件。编译完的 C# 程序实际上会打包到程序集中。程序集的文件扩展名通常为 .exe.dll,具体取决于实现的是应用程序还是

以下示例在 Acme.Collections 命名空间中声明 Stack 类:

  1. using System;
  2. namespace Acme.Collections
  3. {
  4. public class Stack
  5. {
  6. Entry top;
  7. public void Push(object data)
  8. {
  9. top = new Entry(top, data);
  10. }
  11. public object Pop()
  12. {
  13. if (top == null)
  14. {
  15. throw new InvalidOperationException();
  16. }
  17. object result = top.data;
  18. top = top.next;
  19. return result;
  20. }
  21. class Entry
  22. {
  23. public Entry next;
  24. public object data;
  25. public Entry(Entry next, object data)
  26. {
  27. this.next = next;
  28. this.data = data;
  29. }
  30. }
  31. }
  32. }

此类的完全限定的名称为 Acme.Collections.Stack此类包含多个成员:一个 top 字段、两个方法(PushPop)和一个 Entry 嵌套类。Entry 类还包含三个成员:一个 next 字段、一个 data 字段和一个构造函数。假定示例的源代码存储在 acme.cs 文件中,以下命令行

  1. csc /t:library acme.cs

将示例编译成库(不含 Main 入口点的代码),并生成 acme.dll 程序集。

重要

上述示例使用 csc 作为命令行 C# 编译器。此编译器是 Windows 可执行文件。若要在其他平台上使用 C#,应使用 .NET Core 工具。.NET Core 生态系统使用 dotnet CLI 来管理命令行生成。这包括管理依赖项和调用 C# 编译器。有关在 .NET Core 支持的平台上使用这些工具的完整说明,请参阅这篇教程

程序集包含中间语言 (IL) 指令形式的可执行代码和元数据形式的符号信息。执行前,程序集中的 IL 代码会被 .NET 公共语言运行时的实时 (JIT) 编译器自动转换成处理器专属代码。

由于程序集是包含代码和元数据的自描述功能单元,因此无需在 C# 中使用 #include 指令和头文件。只需在编译程序时引用特定的程序集,即可在 C# 程序中使用此程序集中包含的公共类型和成员。例如,此程序使用 acme.dll 程序集中的 Acme.Collections.Stack 类:

  1. using System;
  2. using Acme.Collections;
  3. class Example
  4. {
  5. static void Main()
  6. {
  7. Stack s = new Stack();
  8. s.Push(1);
  9. s.Push(10);
  10. s.Push(100);
  11. Console.WriteLine(s.Pop());
  12. Console.WriteLine(s.Pop());
  13. Console.WriteLine(s.Pop());
  14. }
  15. }

如果程序存储在文件 example.cs 中,编译 example.cs 时,可以使用编译器的 /r 选项引用 acme.dll 程序集:

  1. csc /r:acme.dll example.cs

这会创建 example.exe 可执行程序集,它将在运行时输出以下内容:

  1. 100
  2. 10
  3. 1

使用 C#,可以将程序的源文本存储在多个源文件中。编译多文件 C# 程序时,可以将所有源文件一起处理,并且源文件可以随意相互引用。从概念上讲,就像是所有源文件在处理前被集中到一个大文件中一样。在 C# 中,永远都不需要使用前向声明,因为声明顺序无关紧要(除了极少数的例外情况)。C# 并不限制源文件只能声明一种公共类型,也不要求源文件的文件名必须与其中声明的类型相匹配。

上一页下一页