![C#从入门到精通(第5版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/406/27563406/b_27563406.jpg)
第2章 开始C#之旅
(视频讲解:1小时10分钟)
本章将详细介绍如何编写一个C#程序,以及C#程序的基本结构,另外,还对C#程序的常用编写规范进行介绍。
通过阅读本章,您可以:
掌握命名空间的概念以及如何引用命名空间
了解类的声明方法
了解Main()方法的使用
掌握一些常用的标识符和关键字
了解什么是C#语句
掌握如何为C#程序添加注释
掌握编写C#程序时需要遵循的书写规则和命名规范
2.1 编写第一个C#程序
![](https://epubservercos.yuewen.com/922B0D/15825993305225606/epubprivate/OEBPS/Images/Figure-P46_9551.jpg?sign=1739406608-p2SWl0loF9sUehYrQq9uZpBhuXClSKMY-0-d1cd8a3a0d15ad59a36a65cf97dfc0b1)
视频讲解
在大多数书籍中,编写的第一个小程序通常是输出“Hello World!”,这里使用Visual Studio 2017和C#语言来编写这个程序,程序在控制台上显示字符串“Hello World!”。具体操作步骤如下。
(1)在Windows操作系统的“开始”菜单界面中找到Visual Studio 2017,单击打开。
(2)选择Visual Studio 2017工具栏中的“文件”→“新建”→“项目”命令,打开“新建项目”对话框,如图2.1所示。
![](https://epubservercos.yuewen.com/922B0D/15825993305225606/epubprivate/OEBPS/Images/Figure-P46_15757.jpg?sign=1739406608-jQdmm3jdq35rlsweggpOsA5LymojCA6Q-0-d321e983406319c34e3957718fdefc57)
图2.1 “新建项目”对话框
(3)选择“控制台应用程序”选项,命名为“Hello_World”,选择保存路径,然后单击“确定”按钮创建一个控制台应用程序。
(4)在Main()方法中输入代码。
【例2.1】创建一个控制台应用程序,使用WriteLine()方法输出“Hello World!”字符串。代码如下:(实例位置:资源包\TM\sl\2\1)
![](https://epubservercos.yuewen.com/922B0D/15825993305225606/epubprivate/OEBPS/Images/Figure-P46_15759.jpg?sign=1739406608-s4oGwp8QJ7HUVUt4EWMIKJOVSNwpE4Bq-0-8bb89371ec24a62d0955a714c037962c)
说明
创建项目时,自动生成的代码不用删除,在自动生成的代码的Mian()方法中编写上面的第3、第4行代码。
程序的运行结果如图2.2所示。
![](https://epubservercos.yuewen.com/922B0D/15825993305225606/epubprivate/OEBPS/Images/Figure-P47_15762.jpg?sign=1739406608-8HMkpH2iSS4BDibeOelfyzAW7qGudopa-0-ec209b7106a3c2687271245525bb3235)
图2.2 输出字符串“Hello World”
2.2 初识C#程序结构
![](https://epubservercos.yuewen.com/922B0D/15825993305225606/epubprivate/OEBPS/Images/Figure-P47_9643.jpg?sign=1739406608-8ycH55KRAaixQshdbWxnA6noQr8dXNCp-0-22604590f8765d5db4c24d6fb1b9f8dd)
视频讲解
C#程序结构大体可以分为命名空间、类、Main()方法、标识符、关键字、语句和注释等。下面将对C#程序的结构进行详细的讲解。
2.2.1 命名空间
C#程序是利用命名空间组织起来的。命名空间既用作程序的“内部”组织系统,也用作向“外部”公开的组织系统(即一种向其他程序公开自己拥有的程序元素的方法)。如果要调用某个命名空间中的类或者方法,首先需要使用using指令引入命名空间,using指令将命名空间名所标识的命名空间内的类型成员导入当前编译单元中,从而可以直接使用每个被导入的类型的标识符,而不必加上它们的完全限定名。
C#中的各命名空间就好像是一个存储了不同类型的仓库,而using指令就好比是一把钥匙,命名空间的名称就好比仓库的名称,可以通过钥匙打开指定名称的仓库,从而在仓库中获取所需的物品。
using指令的基本形式为:
![](https://epubservercos.yuewen.com/922B0D/15825993305225606/epubprivate/OEBPS/Images/Figure-P47_9571.jpg?sign=1739406608-wFjQhEIqmhoQsjdRDf0YI2yPOlD86N7X-0-ff63c3d8949bb65c8447255a48003c3e)
【例2.2】创建一个控制台应用程序,建立一个命名空间N1,在命名空间N1中有一个类A,在项目中使用using指令引入命名空间N1,然后在命名空间Test02中即可实例化命名空间N1中的类,最后调用此类中的Myls()方法,代码如下。(实例位置:资源包\TM\sl\2\2)
![](https://epubservercos.yuewen.com/922B0D/15825993305225606/epubprivate/OEBPS/Images/Figure-P47_15764.jpg?sign=1739406608-BvBsGOd1bZy2gvREl7D92sGNkYd7xbie-0-5e97ddf872b0cb35ca5e4cebd53f1f8b)
程序的运行结果为“吴京登顶中国电影票房第一人”。
2.2.2 类
类是一种数据结构,它可以封装数据成员、函数成员和其他的类。类是创建对象的模板。C#中所有的语句都必须位于类内。因此,类是C#语言的核心和基本构成模块。C#支持自定义类,使用C#编程就是编写自己的类来描述实际需要解决的问题。
类就好比医院的各个部门,如内科、骨科、泌尿科、眼科等,在各科室中都有自己的工作方法,相当于在类中定义的变量、方法等。如果要救治车祸重伤的病人,仅一个部门是不行的,可能要内科、骨科、脑科等多个部门一起治疗才行,这时可以让这几个部门临时组成一个小组,对病人进行治疗,这个小组就相当于类的继承,也就是该小组可以动用这几个部门中的所有资源和设备。
使用任何新的类之前都必须声明它,一个类一旦被声明,就可以当作一种新的类型来使用,在C#中通过使用class关键字来声明类,声明形式如下。
![](https://epubservercos.yuewen.com/922B0D/15825993305225606/epubprivate/OEBPS/Images/Figure-P48_9743.jpg?sign=1739406608-6buPwouK4XdOjUQjjFrfsFCoiNdzC5Qb-0-12113f1833c007302ad96d467cc9ca6f)
在C#中,类名是一种标识符,必须符合标识符的命名规则。类名要能够体现类的含义和用途。类名一般采用第一个字母大写的名词,也可以采用多个词构成的组合词。
【例2.3】声明一个最简单的类,此类没有任何意义,只演示如何声明一个类,代码如下。
![](https://epubservercos.yuewen.com/922B0D/15825993305225606/epubprivate/OEBPS/Images/Figure-P48_15768.jpg?sign=1739406608-XY6wwpRjScQdNyuPYzSLuAUMvS5ax0Jb-0-85839f71e56b25eceab39ba0151bc645)
闯关训练:在C#程序中定义一个名称为Car的表示汽车的类。
2.2.3 Main()方法
Main()方法是程序的入口点,C#程序中必须包含一个Main()方法,在该方法中可以创建对象和调用其他方法,一个C#程序中只能有一个Main()方法,并且在C#中所有的Main()方法都必须是静态的。C#是一种面向对象的编程语言,即使是程序的启动入口点,它也是一个类的成员。由于程序启动时还没有创建类的对象,因此,必须将入口点Main()方法定义为静态方法,使它可以不依赖于类的实例对象而执行。
Main()方法就相当于汽车的电瓶,在生产汽车时,将各个零件进行组装,相当于程序的编写。当汽车组装完成后,就要检测汽车是否可用,如果想启动汽车,就必须通过电瓶来启动汽车的各个部件,如发动机、车灯等,电瓶就相当于启动汽车的入口点。
可以用3个修饰符修饰Main()方法,分别是public、static和void。
- ☑ public:说明Main()方法是共有的,在类的外面也可以调用整个方法。
- ☑ static:说明Mian()方法是一个静态方法,即这个方法属于类的本身而不是这个类的特定对象。调用静态方法不能使用类的实例化对象,必须直接使用类名来调用。
- ☑ void:此修饰符说明Mian()方法无返回值。
2.2.4 标识符及关键字
1. 标识符
标识符可以简单地理解为一个名字,用来标识类名、变量名、方法名、数组名、文件名的有效字符序列。
C#语言规定标识符由任意顺序的字母、下画线(_)和数字组成,并且第一个字符不能是数字。标识符不能是C#中的保留关键字。
下面是合法标识符:
![](https://epubservercos.yuewen.com/922B0D/15825993305225606/epubprivate/OEBPS/Images/Figure-P49_15771.jpg?sign=1739406608-ujEL4xIiHekZwium4r8hR4e5jMNP64HE-0-57fc6c50c5efcaafe2ac7b184c64c4cb)
下面是非法标识符:
![](https://epubservercos.yuewen.com/922B0D/15825993305225606/epubprivate/OEBPS/Images/Figure-P49_15772.jpg?sign=1739406608-D7cvvTKCwOdk8wx2jULJNRMuiBb3dtND-0-160120aaebda9eb12ef22a8673b66bfc)
在C#语言中,标识符中的字母是严格区分大小写的,如good和Good是不同的两个标识符。
2. 关键字
关键字是C#语言中已经被赋予特定意义的一些单词,不可以把这些关键字作为标识符来使用。大家经常看到的class、static和void等都是关键字。C#语言中的常用关键字如表2.1所示。
表2.1 C#常用关键字
![](https://epubservercos.yuewen.com/922B0D/15825993305225606/epubprivate/OEBPS/Images/Figure-T50_15773.jpg?sign=1739406608-3VRadCrNVTChcxy5UjychredhlYoyvQg-0-9357079de881e85fbf8720adfcbb8fff)
2.2.5 C#语句
语句是构造所有C#程序的基本单位。语句可以声明局部变量或常数、调用方法、创建对象或将值赋给变量、属性或字段,语句通常以分号终止。
【例2.4】下面的代码就是一条语句。
![](https://epubservercos.yuewen.com/922B0D/15825993305225606/epubprivate/OEBPS/Images/Figure-P50_15774.jpg?sign=1739406608-lCvXHdgvx86cAZ8IKfY2oHVsqlRYzILd-0-a56fa3d78b7eeab4128d43c003049103)
此语句便是调用Console类中的WriteLine()方法,输出指定的字符串“Hello World!”。
2.2.6 注释
编译器编译程序时不执行注释的代码或文字,其主要功能是对某行或某段代码进行说明,方便对代码的理解与维护,这一过程就好像是超市中各商品的下面都附有价格标签,对商品的价格进行说明。注释可以分为行注释和块注释两种,行注释都以“//”开头。
【例2.5】在“Hello World!”程序中使用行注释,代码如下。
![](https://epubservercos.yuewen.com/922B0D/15825993305225606/epubprivate/OEBPS/Images/Figure-P50_15775.jpg?sign=1739406608-d5RgN5fjUqk8EjIHLdEG9dq6wzADujgG-0-8e43fea4e14c73ecf04ae67b1d3d0d10)
如果注释的行数较少,一般使用行注释。对于连续多行的大段注释,则使用块注释,块注释通常以“/*”开始,以“*/”结束,注释的内容放在它们之间。
【例2.6】在“Hello World!”程序中使用块注释,代码如下。
![](https://epubservercos.yuewen.com/922B0D/15825993305225606/epubprivate/OEBPS/Images/Figure-P50_15776.jpg?sign=1739406608-g3jnEv9ecLO1s5t4d619TNfJVqKf2jvZ-0-5610cf7f3d0deb6c98445307a1ac3d11)
注意
注释可以出现在代码的任意位置,但是不能分隔关键字和标识符。例如,下面的代码注释是错误的:
static void //错误的注释 Main(string[] args)
闯关训练:创建一个控制台应用程序,为代码添加著作权信息的注释,包括开发日期、作者、代码的作用等。
2.3 程序编写规范
![](https://epubservercos.yuewen.com/922B0D/15825993305225606/epubprivate/OEBPS/Images/Figure-P51_10035.jpg?sign=1739406608-YHfxusMHpGKehnnStobTCKtHj0i33CdY-0-98c8b7b22809f37e53efab9e8a73db08)
视频讲解
本节将详细介绍代码的书写规则以及命名规范,使用代码书写规则和命名规范可以使程序代码更加规范化,对代码的理解与维护起到至关重要的作用。
2.3.1 代码书写规则
代码书写规则通常对应用程序的功能没有影响,但它们对于改善对源代码的理解是有帮助的。养成良好的习惯对于软件的开发和维护都是很有益的,下面介绍一些代码书写规则。
- ☑ 尽量使用接口,然后使用类实现接口,以提高程序的灵活性。
- ☑ 尽量不要手工更改计算机生成的代码,若必须更改,一定要改成和计算机生成的代码风格一样。
- ☑ 关键的语句(包括声明关键的变量)必须要写注释。
- ☑ 建议局部变量在最接近使用它的地方声明。
- ☑ 不要使用goto系列语句,除非是用在跳出深层循环时。
- ☑ 避免写超过5个参数的方法。如果要传递多个参数,则使用结构。
- ☑ 避免书写代码量过大的try-catch代码块。
- ☑ 避免在同一个文件中放置多个类。
- ☑ 生成和构建一个长的字符串时,一定要使用StringBuilder类型,而不用string类型。
- ☑ switch语句一定要有default语句来处理意外情况。
- ☑ 对于if语句,应该使用一对“{}”把语句块包含起来。
- ☑ 尽量不使用this关键字引用。
2.3.2 命名规范
命名规范在编写代码中起到很重要的作用,虽然不遵循命名规范,程序也可以运行,但是使用命名规范可以很直观地了解代码所代表的含义。下面列出一些命名规范,供读者参考。
- ☑ 用Pascal规则来命名方法和类型,Pascal的命名规则是第一个字母必须大写,并且后面的连结词的第一个字母均为大写。
【例2.7】定义一个公共类,并在此类中创建一个公共方法,代码如下。
![](https://epubservercos.yuewen.com/922B0D/15825993305225606/epubprivate/OEBPS/Images/Figure-P52_15952.jpg?sign=1739406608-tBa37lkGcMKedhRtZ04codIBwvoWendn-0-056e9a2f1c79f057c27182419a225347)
- ☑ 用Camel规则来命名局部变量和方法的参数,Camel规则是指名称中第一个单词的第一个字母小写,并且后面的连接词的第一个字母均为大写。
【例2.8】声明一个字符串变量和创建一个公共方法,代码如下。
![](https://epubservercos.yuewen.com/922B0D/15825993305225606/epubprivate/OEBPS/Images/Figure-P52_15953.jpg?sign=1739406608-3xIceVAXP2Lc6WmhK9C6EfBzyDb9X0D5-0-313bdfc1fa5747ae1e9a16606fbf8233)
- ☑ 所有的成员变量前加前缀“_”。
【例2.9】在公共类DataBase中声明一个私有成员变量_connectionString,代码如下。
![](https://epubservercos.yuewen.com/922B0D/15825993305225606/epubprivate/OEBPS/Images/Figure-P52_15954.jpg?sign=1739406608-ZAc1gi8Fkb6yNBdw5ifBhRiAkCZACScB-0-17d186a0690eeee21ba63d30ce8b7916)
- ☑ 接口的名称加前缀“I”。
【例2.10】创建一个公共接口Iconvertible,代码如下。
![](https://epubservercos.yuewen.com/922B0D/15825993305225606/epubprivate/OEBPS/Images/Figure-P52_15955.jpg?sign=1739406608-qyUJpTt58UGZQmOgKmswlfMB3fUiAoel-0-95aeca86ee7ac6fc4082cbce6f4309c3)
- ☑ 方法的命名,一般将其命名为动宾短语。
【例2.11】在公共类File中创建CreateFile()方法和GetPath()方法,代码如下。
![](https://epubservercos.yuewen.com/922B0D/15825993305225606/epubprivate/OEBPS/Images/Figure-P52_15956.jpg?sign=1739406608-UrP5kEyRPCBUCAQOpCxevGeayNOtYATn-0-6e1829cd23e67d54fbc09e87ecba6c9c)
- ☑ 所有的成员变量声明在类的顶端,用一个换行把它和方法分开。
【例2.12】在类的顶端声明两个私有变量_productId和_productName,代码如下。
![](https://epubservercos.yuewen.com/922B0D/15825993305225606/epubprivate/OEBPS/Images/Figure-P53_15963.jpg?sign=1739406608-SGJERPqQIqmq9q96KHPJVA9PPXiGOFu8-0-dd89419ca3caab8629a6b9c902e7af92)
注意
在类中定义私有变量和私有方法,变量和方法只能在该类中使用,不能对类进行实例化,对其进行调用。
- ☑ 用有意义的名字命名空间namespace,如公司名、产品名。
【例2.13】利用公司名和产品名命名空间namespace,代码如下。
![](https://epubservercos.yuewen.com/922B0D/15825993305225606/epubprivate/OEBPS/Images/Figure-P53_15970.jpg?sign=1739406608-SuFd5AqpOOThycjpdY8lBIYSGzVhFcim-0-f952f38868c93260884bf2c4a129e7c0)
- ☑ 使用某个控件的值时,尽量命名局部变量。
【例2.14】创建一个方法,在方法中声明一个字符串变量title,使其等于Label控件的Text值,代码如下。
![](https://epubservercos.yuewen.com/922B0D/15825993305225606/epubprivate/OEBPS/Images/Figure-P53_15971.jpg?sign=1739406608-jp4npP1m8aKBW8UE2UIHGHblY1EaiXjD-0-9a5bb5c404fd93f885082ed692361f44)
说明
在定义有返回值的方法时,必须在设置方法时,定义方法的类型,并在方法体结束后用return返回值。
2.4 小 结
本章主要介绍了C#程序的结构、代码书写规范和命名规则。在C#程序的结构中,读者需要重点掌握命名空间、类以及C#语句。命名空间在C#程序中占有重要的地位,通过引入命名空间,可以将空间下的成员引入当前的编译单元中;而类是C#语言的核心和基本构成模块,程序员可以通过编写类来描述实际开发需要解决的问题。在编写程序代码时,读者要养成一种良好的编写习惯,本章列出一些代码书写规则和命名规范,希望能对读者有所帮助。
2.5 动手纠错
(1)运行“资源包\TM\排错练习\02\01”文件夹下的程序,出现“当前上下文中不存在名称Name”的错误提示,请根据注释改正程序。
(2)运行“资源包\TM\排错练习\02\02”文件夹下的程序,出现“应输入标识符;int是关键字”的错误提示,请根据注释改正程序。
(3)运行“资源包\TM\排错练习\02\03”文件夹下的程序,出现“无法使用实例引用访问成员Test03.Program.i;请改用类型名称对其加以限定”的错误提示,请根据注释改正程序。
(4)运行“资源包\TM\排错练习\02\04”文件夹下的程序,出现“使用了未赋值的局部变量price”的错误提示,请根据注释改正程序。
(5)运行“资源包\TM\排错练习\02\05”文件夹下的程序,出现“Test05.Test.i不可访问,因为它受保护级别限制”的错误提示,请根据注释改正程序。