2.2 C# 程序结构预览
前面讲解了如何创建第一个C#程序,输出“Hello World”程序完整代码的效果如图2.5所示。

图2.5 输出 “Hello World” 程序完整代码的效果
从图2.5 中可以看出,一个C# 程序总体可以分为命名空间、类、关键字、标识符、Main 方法、C# 语句和注释。本节将分别对C# 程序的各个组成部分进行讲解。
2.2.1 命名空间

在Visual Studio 中创建项目时,会自动生成一个与项目名称相同的命名空间。例如,在创建输出 “Hello_World” 项目时,会自动生成一个名称为 “Hello_World” 的命名空间,如图2.6 所示。

图2.6 自动生成的命名空间
命名空间在C# 程序中起到组成程序的作用,正如图2.6 所示,在C# 程序中定义命名空间时,需要使用namespace 关键字,其语法如下。

学习笔记
开发人员一般不用自定义命名空间,因为在创建项目或创建类文件时,Visual Studio 会自动生成一个命名空间。
命名空间既作为程序的 “内部” 组织系统,也作为向 “外部” 公开(一种向其他程序公开自己拥有的程序元素的方法)的组织系统。如果要调用某个命名空间中的类或方法,则首先需要使用using 指令引入命名空间,这样就可以直接使用该命名空间中所包含的成员(包括类及类中的属性、方法等)了。
using 指令的基本形式如下。

学习笔记
C# 程序中的命名空间就像一个包含不同类型物品的仓库,而using 指令就好比一把钥匙,命名空间的名称就好比仓库的名称,用户可以通过钥匙打开指定名称的仓库,进而从仓库中获取所需要的物品,其示意图如图2.7 所示。

图2.7 命名空间与仓库对比示意图
例如,下面的代码定义了一个Demo 命名空间。

定义命名空间后,如果要使用命名空间中所包含的类,则需要使用using 指令引用命名空间。例如,下面代码使用using 指令引用自定义的Demo 命名空间。

学习笔记
如果在使用指定命名空间中的类时,没有使用using 指令引用命名空间,如下面代码所示,则会出现如图2.8 所示的错误提示信息。


图2.8 没有引用命名空间而使用其中的类时出现的错误提示信息
要改正以上代码,可以直接在命名空间区域使用using 指令引用Demo 命名空间,代码如下。

学习笔记
在使用命名空间中的类时,如果不想用using 指令引用命名空间,则可以在代码中使用命名空间调用其中的类。例如,下面的代码直接使用Demo 命名空间调用其中的Operation 类。

2.2.2 类

C# 程序的主要功能代码都是在类中实现的。类是一种数据结构,它可以封装数据成员、方法成员和其他的类。因此,类是C# 的核心和基本构成模块。C# 支持自定义类,使用C# 编程就是通过编写自己的类来描述实际需要解决的问题。
学习笔记
如果把命名空间比作一家医院,类就相当于该医院的各个科室,如外科、妇科、内儿科、中医科等,各科室都有自己的工作方法,相当于在类中定义的变量、方法等。命名空间与类的关系示意图如图2.9 所示。

图2.9 命名空间与类的关系示意图
在使用类之前都必须进行声明,一个类一旦被声明,就可以作为一个新的类使用。在C# 中通过使用class 关键字来声明类,声明语法如下。

学习笔记
在声明类时,还可以指定类的修饰符和其要继承的基类或者接口等信息,这里只要知道如何声明一个最基本的类即可,关于类的详细内容,会在第7章中进行专题讲解。
在上面的语法中,在命名类的名称时,最好能够体现类的含义或用途,而且类名一般采用第一个字母大写的名词,也可以采用多个词构成的组合词。
例如,声明一个汽车类,命名为Car(该类没有任何意义,只演示如何声明一个类),代码如下。

2.2.3 关键字与标识符

1.关键字
关键字是C# 中已经被赋予特定意义的一些单词,在开发程序时,不可以把这些关键字作为命名空间、类、方法或属性等使用。输出 “Hello World” 程序中的using、namespace、class、static 和void 等都是关键字。C# 中的常用关键字如表2.1 所示。
表2.1 C# 中的常用关键字

学习笔记
如果在开发程序时,使用C# 中的关键字作为命名空间、类、方法或属性等的名称,如下面代码使用C# 中的关键字void 作为类的名称,则会出现如图2.10 所示的错误提示信息。


图2.10 使用C# 中的关键字作为类名时出现的错误提示信息
2.标识符
标识符可以简单地理解为一个名字,比如每个人都有自己的名字,它主要用来标识类名、变量名、方法名、属性名、数组名等各种成员。
C# 标识符命名规则如下。
●由任意顺序的字母、下画线(_)和数字组成。
●第一个字符不能是数字。
●不能是C# 中的保留关键字。
下面是合法标识符。

下面是非法标识符。

学习笔记
在C# 中,标识符中不能包含#、%、$ 等特殊字符。
在C# 中,标识符中的字母是严格区分大小写的。两个相同的单词,如果大小写格式不一样,那么所代表的意义是完全不同的。例如,下面3 个变量是完全独立、毫无关系的,就像3 个长得比较像的人,彼此之间都是独立的个体。

学习笔记
在C# 中允许使用汉字作为标识符,如 “class 运算类”,在程序运行时并不会出现错误,但建议读者尽量不要使用汉字作为标识符。
2.2.4 Main 方法

在Visual Studio 中创建控制台应用程序后,会自动生成一个Program.cs 文件,该文件有一个默认的Main 方法,代码如下。

每个C# 程序中都必须包含一个Main 方法,它是类体中的主方法,也称为入口方法,可以说是激活整个程序的开关。Main 方法从 “{” 开始,至 “}” 结束。static 和void 分别是Main 方法的静态修饰符和返回值修饰符,C# 程序中的Main 方法必须声明为static,并且区分大小写。
学习笔记
如果将Main 方法前面的static 关键字删除,则程序在运行时会出现如图2.11 所示的错误提示信息。

图2.11 删除static 关键字时Main 方法出现的错误提示信息
Main 方法一般都是在创建项目时自动生成的,不用开发人员手动编写或修改。如果需要修改,则需要注意以下3 个方面。
● Main 方法在类或结构内声明,它必须是静态(static)的,而且不应该是公用(public)的。
●Main 方法的返回类型有两种:void 或 int。
●Main 方法可以包含命令行参数string[] args,也可以不包括。
根据以上3 个方面的内容可以总结出,Main 方法有以下4 种声明方式。

学习笔记
通常在Main 方法中不写具体逻辑代码,只进行类实例化和方法调用(这好比手机来电话了,只需要按 “接听” 键就可以通话,而不需要考虑手机通过怎样的信号转换将电磁信号转换成声音)。这样的代码简洁明了,容易维护。养成良好的编码习惯,可以让程序员的工作事半功倍。
2.2.5 C# 语句

C# 语句是构造所有C# 程序的基本单位,使用C# 语句可以声明变量和常量、调用方法、创建对象或执行任何逻辑操作。C# 语句以分号终止。
例如,在输出 “Hello World” 程序中输出 “Hello World” 字符串和定位控制台窗体的代码就是C# 语句。

上面的代码是两条最基本的C# 语句,用来在控制台窗体中输出内容和读取内容,它们都用到了Console 类。Console 类表示控制台应用程序的标准输入流、标准输出流和错误流,该类中包含很多方法,但与输入、输出相关的主要有4 个方法,如表2.2 所示。
表2.2 Console 类中与输入、输出相关的方法

其中,Console.Read 方法和Console.ReadLine 方法用来从控制台读取,它们的使用区别如下。
●Console.Read 方法:返回值为int 类型,只能记录int 类型的数据。
●Console.ReadLine 方法:返回值为string 类型,可以将控制台中输入的任何类型的数据存储为字符串类型的数据。
学习笔记
在开发控制台应用程序时,经常使用Console.Read 方法或Console.ReadLine 方法定位控制台窗体。
Console.Write 方法和Console.WriteLine 方法用来向控制台输出,它们的使用区别如下。
●Console.Write 方法:输出后不换行。
例如,使用Console.Write 方法输出 “Hello World” 字符串,代码如下。

代码的运行结果如图2.12 所示。

图2.12 使用Console.Write 方法输出 “Hello World” 字符串代码的运行结果
●Console.WriteLine 方法:输出后换行。
例如,使用Console.WriteLine 方法输出 “Hello World” 字符串,代码如下。

代码的运行结果如图2.13 所示。

图2.13 使用Console.WriteLine 方法输出 “Hello World” 字符串代码的运行结果
学习笔记
C# 代码中所有的字母、数字、括号及标点符号均为英文输入法状态下的半角符号,而不能是中文输入法或英文输入法状态下的全角符号。例如,图2.14 所示为中文输入法的分号引起的错误提示信息。

图2.14 中文输入法的分号引起的错误提示信息
2.2.6 注释

注释是在编译程序时不执行的代码或文字,其主要功能是对某行或某段代码进行说明,以方便代码的理解与维护,或者在调试程序时将某行或某段代码设置为无效代码。常用的注释主要有行注释和块注释两种,下面分别进行简单介绍。
学习笔记
注释就像超市中各商品下面的价格标签,对商品的名称、价格、产地等信息进行说明,如图2.15 所示。而在程序中,注释的最基本作用就是描述代码的作用,告诉别人你的代码要实现什么功能。

图2.15 超市中各商品下面的价格标签相当于注释
1.行注释
行注释以 “//” 开头,后面跟注释的内容。例如,在输出 “Hello World” 程序中使用行注释解释每行代码的作用,代码如下。


学习笔记
注释可以出现在代码的任意位置,但是不能分隔关键字和标识符。例如,下面的代码注释是错误的。

2.块注释
如果注释的行数较少,则一般使用行注释。对于连续多行的大段注释,则使用块注释。块注释通常以 “/*” 开始,以 “*/” 结束,注释的内容放在它们之间。
例如,在输出 “Hello World” 程序中使用块注释将输出 “Hello World” 字符串和定位控制台窗体的C# 语句注释为无效代码,代码如下。

学习笔记
块注释通常用来为类文件、类或方法等添加版权、功能等信息。例如,下面的代码使用块注释为Program.cs 类添加版权、功能及修改日志等信息。


2.2.7 一个完整的C# 程序

通过以上内容的讲解,我们熟悉了C# 程序的基本组成,下面通过一个示例讲解如何编写一个完整的C# 程序。
示例2.输出软件启动页
使用Visual Studio 2017 创建一个控制台应用程序,然后使用Console.WriteLine 方法在控制台模拟输出 “编程词典(珍藏版)” 软件的启动页,代码如下。


完成以上操作后,单击Visual Studio 2017 工具栏中的图标按钮即可运行上面的代码,代码运行结果如图2.16 所示。

图2.16 输出软件启动页代码运行结果