
第2章 初识C#程序结构
(
视频讲解:1小时13分钟)
要学习C#编程,必然要熟悉C#程序的结构,而为了能够养成一个良好的编码习惯,在学习C#之初,熟悉常用的C#程序编写规范也是非常重要的。本章将详细介绍如何编写一个C#程序,以及C#程序的基本结构;另外,还对C#程序的常用编写规范进行介绍。
通过学习本章,读者主要掌握以下内容:
使用Visual Studio 2017开发C#程序的流程
一个C#程序的基本结构
C#程序的代码编写规则
C#程序的命名规范
2.1 编写第一个C#程序

视频讲解
在大多数编程语言中,编写的第一个程序通常都是输出“Hello World”,这里将使用Visual Studio 2017和C#语言来编写这个程序。首先看一下使用Visual Studio 2017开发C#程序的基本步骤,如图2.1所示。

图2.1 使用Visual Studio 2017开发C#程序的基本步骤
通过图2.1中的3个步骤,开发人员即可很方便地创建并运行一个C#程序,例如,使用Visual Studio 2017在控制台中创建“Hello World”程序并运行,具体开发步骤如下。
(1)在系统的开始菜单中找到“所有程序”→Visual Studio 2017,单击打开Visual Studio 2017开发环境。
说明
如果是Windows 10操作系统,则在开始菜单列表中找到Visual Studio 2017,单击即可打开Visual Studio 2017开发环境。
(2)选择Visual Studio 2017工具栏中的“文件”→“新建”→“项目”命令,打开“新建项目”对话框,如图2.2所示。

图2.2 “新建项目”对话框
说明
图2.2中的项目保存路径可以设置为计算机上的任意路径。
(3)按照图2.2中的步骤创建一个控制台应用程序。
(4)控制台应用程序创建完成后,会自动打开Program.cs文件,在该文件的Main方法中输入如下代码:

单击Visual Studio 2017开发环境工具栏中的图标按钮,运行该程序,效果如图2.3所示。

图2.3 输出“Hello World”
上面的代码中,使用C#输出了开发人员进入“编程世界”后遇到的一个最经典语句“Hello World”,下面通过一个符合中国人习惯的实例看一下如何在C#中输出中文内容。
【例2.01】使用数组保存数据创建一个控制台应用程序,使用Console.WriteLine方法输出小米董事长雷军的经典语录“人因梦想而伟大”,完整代码如下:(实例位置:资源包\源码\02\2.01)

程序运行效果如图2.4所示。

图2.4 输出中文字符串
2.2 C#程序结构预览

视频讲解
上面讲解了如何创建第一个C#程序,其完整代码效果如图2.5所示。

图2.5 Hello World程序完整代码效果
从图2.5中可以看出,一个C#程序总体可以分为命名空间、类、关键字、标识符、Main方法、语句和注释等。本节将分别对C#程序的各个组成部分进行讲解。
2.2.1 命名空间
在Visual Studio开发环境中创建项目时,会自动生成一个与项目名称相同的命名空间,例如,2.1节中创建“Hello_World”项目时,会自动生成一个名称为“Hello_World”的命名空间,如图2.6所示。

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

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

例如,下面代码定义了一个Demo命名空间:

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

常见错误
如果在使用指定命名空间中的类时,没有使用using引用命名空间,如下面的代码:

则会出现如图2.7所示的错误提示信息。
要改正以上代码,可以直接在命名空间区域使用using引用Demo命名空间,代码如下:


图2.7 没有引用命名空间而使用其中的类时出现的错误
多学两招
在使用命名空间中的类时,如果不想用using指令引用命名空间,可以在代码中使用命名空间调用其中的类,例如,下面代码直接使用Demo命名空间调用其中的Operation类:

2.2.2 类
C#程序的主要功能代码都是在类中实现的,类是一种数据结构,它可以封装数据成员、方法成员和其他的类。因此,类是C#语言的核心和基本构成模块。C#支持自定义类,使用C#编程就是编写自己的类来描述实际需要解决的问题。
说明
如果把命名空间比作一个医院,类就相当于该医院的各个科室,如内科、骨科、泌尿科、眼科等,在各科室中都有自己的工作方法,相当于在类中定义的变量、方法等。
使用类之前都必须首先进行声明,一个类一旦被声明,就可以当作一种新的类型来使用,在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.8所示的错误提示信息。

图2.8 使用C#关键字作为类名时的错误信息
2. 标识符
标识符可以简单地理解为一个名字,比如每个人都有自己的名字,它主要用来标识类名、变量名、方法名、属性名、数组名等各种成员。
C#语言标识符命名规则如下:
(1)由任意顺序的字母、下画线(_)和数字组成。
(2)第一个字符不能是数字。
(3)不能是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.9所示的错误提示信息。

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

技巧
通常Main方法中不写具体逻辑代码,只做类实例化和方法调用。好比手机来电话了,只需要按“接通”键就可以通话,而不需要考虑手机通过怎样的信号转换将电磁信号转化成声音。这样的代码简洁明了,容易维护。养成良好的编码习惯,可以让程序员的工作事半功倍。
2.2.5 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.10所示。


图2.10 使用Console.Write方法输出“Hello World”字符串
Console.WriteLine方法—输出后换行
例如,使用Console.WriteLine方法输出“Hello World”字符串,代码如下,效果如图2.11所示。


图2.11 使用Console.WriteLine方法输出“Hello World”字符串
注意
C#代码中所有的字母、数字、括号,以及标点符号均为英文输入法状态下的半角符号,而不能是中文输入法或者英文输入法状态下的全角符号。例如,图2.12为中文输入法的分号引起的错误提示。

图2.12 中文输入法的分号引起的错误提示
2.2.6 注释
注释是在编译程序时不执行的代码或文字,其主要功能是对某行或某段代码进行说明,方便代码的理解与维护,或者在调试程序时,将某行或某段代码设置为无效代码。常用的注释主要有行注释和块注释两种,下面分别进行简单介绍。
说明
注释就像是超市中各商品下面的价格标签,对商品的名称、价格、产地等信息进行说明;而程序中,注释的最基本作用就是描述代码的作用,告诉别人你的代码要实现什么功能。
1. 行注释
行注释都以“//”开头,后面跟注释的内容。例如,在Hello World程序中使用行注释,解释每一行代码的作用,代码如下:

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

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

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

2.2.7 一个完整的C#程序
通过以上内容的讲解,我们熟悉了C#程序的基本组成,下面通过一个实例讲解如何编写一个完整的C#程序。
【例2.02】 使用Visual Studio 2017开发环境创建一个控制台应用程序,然后使用Console.WriteLine方法在控制台中模拟输出“编程词典(珍藏版)”软件的启动页。代码如下:(实例位置:资源包\源码\02\2.02)

完成以上操作后,单击Visual Studio 2017开发环境工具栏中的图标按钮,即可运行该程序,程序运行结果如图2.13所示。

图2.13 输出软件启动页
2.3 程序编写规范

视频讲解
下面给出两段实现同样功能的代码,如图2.14所示。

图2.14 两段相同的C#代码
大家在学习时,愿意看图2.14中的左侧代码还是右侧代码?答案应该是肯定的,大家肯定都喜欢阅读图2.14中的右侧代码,因为它看上去更加规整,这是一种最基本的代码编写规范。本节将对C#代码的编写规则以及命名规范进行介绍。遵循一定的代码编写规则和命名规范可以使代码更加规范化,对代码的理解与维护起到至关重要的作用。
2.3.1 代码编写规则
代码编写规则通常对应用程序的功能没有影响,但它们对于改善对源代码的理解是有帮助的。养成良好的习惯对于软件的开发和维护都是很有益的,下面列举一些常用的代码编写规则。
编写C#程序时,统一代码缩进的样式,例如统一缩进两个字符或者4个字符位置。
每编写一行C#代码,都应该换行编写下一行代码。
在编写C#代码时,应该合理使用空格,以便使代码结构更加清晰。
尽量使用接口,然后使用类实现接口,以提高程序的灵活性。
关键的语句(包括声明关键的变量)必须要写注释。
建议局部变量在最接近使用它的地方声明。
不要使用goto系列语句,除非是用在跳出深层循环时。
避免编写超过5个参数的方法,如果要传递多个参数,则使用结构。
避免书写代码量过大的try-catch语句块。
避免在同一个文件中编写多个类。
生成和构建一个长的字符串时,一定要使用StringBuilder类型,而不用string类型。
对于if语句,应该使用一对“{ }”把语句块包含起来。
switch语句一定要由default语句来处理意外情况。
2.3.2 命名规范
命名规范在编写代码中起到很重要的作用,虽然不遵循命名规范,程序也可以运行,但是使用命名规范可以更加直观地了解代码所代表的含义。本节将介绍C#中常用的一些命名规范。
1. 两种命名方法
在C#中,最常用的有两种命名方法,分别是Pascal命名法和Camel命名法,下面分别介绍。
用Pascal命名法来命名方法和类型。Pascal命名法规定第一个字母必须大写,并且后面连接词的第一个字母均为大写。
说明
Pascal是以纪念法国数学家Blaise Pascal而命名的一种编程语言,C#中的Pascal命名法就是根据该语言的特点总结出来的一种命名方法。
例如,定义一个公共类,并在此类中创建一个公共方法,代码如下:

用Camel命名法来命名局部变量和方法的参数。Camel命名法规定指名称中第一个单词的第一个字母小写。
说明
Camel命名法又称驼峰式命名法,它是由骆驼的体型特征推理出来的一种命名方法。
例如,声明一个字符串变量和创建一个公共方法,代码如下:

2. 程序中的命名规范
开发项目时,不可避免地会遇到各个程序元素的命名问题,例如项目的命名、类的命名、方法的命名等,如图2.15中声明了一个User类,图2.16中声明了一个aaa类。

图2.15 声明User类

图2.16 声明aaa类
查看图2.15和图2.16,从类的命名上,可以很容易看出,图2.15中的User类应该是与用户相关的一个类,但是图2.16中声明的aaa类,即使再有想象力的人,恐怕也想象不出这个类到底是做什么用的吧?从这两个例子可以看出,在对程序元素命名时,如果遵循一定的规范,将使代码更加具有可读性,下面介绍一下常用程序元素的基本命名规范。
命名项目名称时,可以使用公司域名+产品名称,或者直接使用产品名称。
例如,利用公司名和产品名定义命名空间,在命名项目时,可以将项目命名为“mingrisoft.ERP”或者“ERP”,其中,mingrisoft是公司的域名,ERP是产品名称。
用有意义的名字定义命名空间,如公司名、产品名。
例如,利用公司名和产品名定义命名空间,代码如下:

接口的名称加前缀“I”。
例如,创建一个公共接口Iconvertible,代码如下:

类的命名最好能够体现出类的功能或操作。
例如,创建一个名称为Operation的类,用来作为运算类,代码如下:

方法的命名:一般将其命名为动宾短语,表明该方法的主要作用。
例如,在公共类File中创建CreateFile方法和GetPath方法,代码如下:

定义成员变量时,最好加前缀“_”。
例如,在公共类DataBase中声明一个私有成员变量_connectionString,代码如下:

2.4 小结
本章主要介绍了C#程序的结构、代码编写规范和命名规范。在C#程序的结构中,读者需要重点掌握命名空间、类,以及C#语句,其中,命名空间在C#程序中占有重要的地位,通过引入命名空间,可以将命名空间下的类引入当前项目中;类是C#语言的核心和基本构成模块,开发人员可以通过编写各种类来描述实际开发需要解决的问题;语句是构造所有C#程序的基本单位,程序中的任何逻辑操作都需要通过C#语句实现。另外,在编写程序代码时,读者要养成一种良好的编写习惯,本章列出一些常用的代码编写规则和命名规范,希望能对读者有所帮助。
2.5 实战
2.5.1 实战一:模拟手机充值业务
在控制台应用程序中模拟以下场景。
计算机输出:欢迎使用XXX充值业务,请输入充值金额:
用户输入:100
计算机输出:充值成功,您本次充值100元。(实例位置:资源包\源码\02\实战\01)
2.5.2 实战二:绘制情人节快乐图案
使用C#在控制台中输出一个情人节快乐图案,程序运行结果如图2.17所示。
(实例位置:资源包\源码\02\实战\02)

图2.17 在控制台中输出情人节快乐图案