以下程序计算12乘以30,并将结果360输出到屏幕上。其中双斜线“ // ”表示后续内容是注释:
上述程序由两个语句构成。在C#中,语句按顺序执行,每个语句都以分号结尾。第一个语句计算表达式12 * 30的值,并把结果存储到变量 x 中,该变量是一个32位整数类型( int )的变量。第二个语句调用 Console 类(定义在 System 命名空间下)的 WriteLine 方法,将变量 x 的值输出到屏幕上的文本窗口中。
方法执行特定功能;类将函数成员和数据成员聚合在一起形成面向对象的构建单元。 Console 类将处理命令行的输入输出功能聚合在一起,例如 WriteLine 方法。类是一种类型,我们会在2.3节进行介绍。
程序最外层是命名空间,类型组织在各个命名空间中。许多常用的类型——包括 Console 类——都在 System 命名空间下,.NET中的库组织在嵌套的命名空间中。例如, System.Text 命名空间中的类型用于处理文本而 System.IO 命名空间中的类型则用于处理输入和输出。
在每次使用 Console 类时都添加 System 命名空间进行修饰会显得累赘。此时可以使用 using 指令导入命名空间来避免烦冗的代码:
编写高层函数来调用低层次函数是一种基本的代码复用手段。可重构(refactor)上述程序,使用可重用的方法 FeetToInches 来计算某个整数乘以12的结果:
上述方法中的一系列语句被成对的大括号包围起来,称为语句块(statement block)。
方法可以通过参数来接收调用者输入的数据,并通过指定的返回类型向调用者返回输出数据。上述代码中的 FeetToInches 方法包含一个用于输入英尺的参数和一个用于输出英寸的返回类型:
示例中的字面量30和100是传递给 FeedToInches 方法的实际参数(argument)。
如果方法没有接收到输入,则应使用空括号。如果不返回任何结果,则应使用 void 关键字:
方法是C#中的诸多种类函数之一。另一种函数是我们用来执行乘法运算的*运算符。其他的函数种类还包括构造器、属性、事件、索引器和终结器。
C#编译器能够将一系列以.cs为扩展名的源代码文件编译成程序集,程序集是.NET中的打包和部署单元。程序集可以是一个应用程序也可以是一个库。普通的控制台程序或Windows应用程序包含一个入口点(entry point),而库则没有。库可以被应用程序或其他的库调用(引用)。.NET 5就是由一系列库(及运行时环境)组成的。
上一节中的每一个程序都是直接由一系列语句(称为顶级语句)开头的。当存在顶级语句时,控制台程序或Windows应用程序将隐式创建入口点(若没有顶级语句,则Main方法将作为应用程序的入口点——请参见2.3.2节)
与.NET Framework不同,.NET 6程序集并没有 .exe 扩展名。NET 6应用程序构建之后生成的 .exe 文件只是一个负责启动 .dll 程序集的原生加载器。这个 .exe 文件是和平台相关的。
.NET 5能够创建自包含部署程序,它包含加载器、程序集以及.NET运行时本身。而以上内容均包含在一个单一 .exe 文件中。
dotnet 工具(在Windows下则为dotnet.exe)是一个用于管理.NET源代码和二进制文件的命令行工具。该工具可以像集成开发环境(例如Visual Studio和Visual Studio Code)那样构建或启动程序。
dotnet 工具可通过安装.NET 5 SDK或安装Visual Studio获得,其默认安装位置在Windows操作系统上位于 %ProgramFiles%/dotnet ,在Ubuntu Linux上位于 /usr/bin/dotnet 。
dotnet 工具在编译应用程序时需要指定一个工程文件(project file)及一个或者多个C#代码文件。以下命令将创建一个控制台应用程序的基本结构:
上述命令将创建名为 MyFirstProgram 的子目录,并在其中创建名为 MyFirstProgram.csproj 的工程文件,以及包含 Main 方法的 Program.cs 代码文件,其中 Main 方法将在控制台输出“Hello World”。
在 MyFirstProgram 目录执行以下命令将构建并启动上述应用程序:
如果仅仅希望构建应用程序,但不执行,则可以执行以下命令:
构建生成的程序集将保存在 bin/debug 子目录下。
我们将在第17章详细介绍程序集。