![零基础C#学习笔记](https://wfqqreader-1252317822.image.myqcloud.com/cover/185/36710185/b_36710185.jpg)
2.2 C# 程序结构预览
前面讲解了如何创建第一个C#程序,输出“Hello World”程序完整代码的效果如图2.5所示。
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_9.jpg?sign=1738819703-9BIQeMK6dF5O13HxuzDBn5nbiwnFvCrg-0-85b76a32a0c5b71075a552d5c09d7192)
图2.5 输出 “Hello World” 程序完整代码的效果
从图2.5 中可以看出,一个C# 程序总体可以分为命名空间、类、关键字、标识符、Main 方法、C# 语句和注释。本节将分别对C# 程序的各个组成部分进行讲解。
2.2.1 命名空间
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_10.jpg?sign=1738819703-A3CS4ubshsqRdSwFCKXHj7keuwWJiKRt-0-f08e3a481b3b07cb39c00932bb205a0b)
在Visual Studio 中创建项目时,会自动生成一个与项目名称相同的命名空间。例如,在创建输出 “Hello_World” 项目时,会自动生成一个名称为 “Hello_World” 的命名空间,如图2.6 所示。
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_11.jpg?sign=1738819703-Y0HxEbXhXHLe8VK0o5VolRJfxhn89zeE-0-a5a9bef90a1dc5f00c7203a4c5efd8fc)
图2.6 自动生成的命名空间
命名空间在C# 程序中起到组成程序的作用,正如图2.6 所示,在C# 程序中定义命名空间时,需要使用namespace 关键字,其语法如下。
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_12.jpg?sign=1738819703-OvC2ufrraBJjDCyodwh8B3LthIXKDZNj-0-ecc733cb93e2fd2873641124c7d00109)
学习笔记
开发人员一般不用自定义命名空间,因为在创建项目或创建类文件时,Visual Studio 会自动生成一个命名空间。
命名空间既作为程序的 “内部” 组织系统,也作为向 “外部” 公开(一种向其他程序公开自己拥有的程序元素的方法)的组织系统。如果要调用某个命名空间中的类或方法,则首先需要使用using 指令引入命名空间,这样就可以直接使用该命名空间中所包含的成员(包括类及类中的属性、方法等)了。
using 指令的基本形式如下。
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_13.jpg?sign=1738819703-pnvbx4Ng7GTsBqgeu2iMaqBhdrs3qt7v-0-ffefd8c32a1c146dc4d72686a10190c3)
学习笔记
C# 程序中的命名空间就像一个包含不同类型物品的仓库,而using 指令就好比一把钥匙,命名空间的名称就好比仓库的名称,用户可以通过钥匙打开指定名称的仓库,进而从仓库中获取所需要的物品,其示意图如图2.7 所示。
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_14.jpg?sign=1738819703-yQv35I4v0qL0TlPe8DghM6S99HktvwJZ-0-f685c4ff747e0e277ea97aa5938c7e00)
图2.7 命名空间与仓库对比示意图
例如,下面的代码定义了一个Demo 命名空间。
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_15.jpg?sign=1738819703-kGGNjETWHxPVegkv8sKISwMuwvyQnRlf-0-e6ebf8bc6e9c3dcbab3c64249e9472e5)
定义命名空间后,如果要使用命名空间中所包含的类,则需要使用using 指令引用命名空间。例如,下面代码使用using 指令引用自定义的Demo 命名空间。
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_16.jpg?sign=1738819703-R2ppsXJNWRuSupIEWHUbVo3uZNwT39Mq-0-7f930917efc0d9e9863f156025f80ca0)
学习笔记
如果在使用指定命名空间中的类时,没有使用using 指令引用命名空间,如下面代码所示,则会出现如图2.8 所示的错误提示信息。
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_17.jpg?sign=1738819703-PJm31KTAENXc1UgwyYupDsPtLl9ygZIc-0-8a7b4a99c116f0ccf3816630be504c8a)
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_18.jpg?sign=1738819703-alcINXChVHUaskZvnmbPpzDgamt1c8Ci-0-941b2c4f869d8ff559b422b12b69dae5)
图2.8 没有引用命名空间而使用其中的类时出现的错误提示信息
要改正以上代码,可以直接在命名空间区域使用using 指令引用Demo 命名空间,代码如下。
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_19.jpg?sign=1738819703-POePZJhMKxMjOSFaFK1TqmwhNGUG87RG-0-4915b956b7eaf3dda83762b18419fa72)
学习笔记
在使用命名空间中的类时,如果不想用using 指令引用命名空间,则可以在代码中使用命名空间调用其中的类。例如,下面的代码直接使用Demo 命名空间调用其中的Operation 类。
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_20.jpg?sign=1738819703-xKTMCTDrCK9QgjSIAVE9xv8ttdZaJ6Ox-0-bd3b5af67b72c562b28fc4741d6e6a48)
2.2.2 类
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_21.jpg?sign=1738819703-MEr49vpohiqomVng6VYkpx7qTiigOUF1-0-5efd860d966f4ab44d68b396998ba1ec)
C# 程序的主要功能代码都是在类中实现的。类是一种数据结构,它可以封装数据成员、方法成员和其他的类。因此,类是C# 的核心和基本构成模块。C# 支持自定义类,使用C# 编程就是通过编写自己的类来描述实际需要解决的问题。
学习笔记
如果把命名空间比作一家医院,类就相当于该医院的各个科室,如外科、妇科、内儿科、中医科等,各科室都有自己的工作方法,相当于在类中定义的变量、方法等。命名空间与类的关系示意图如图2.9 所示。
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_22.jpg?sign=1738819703-vh5qfiEXB7T3b5SlyhTMJG6MbEmfucWM-0-4be0100c7337473d6f4e721865dbdc0b)
图2.9 命名空间与类的关系示意图
在使用类之前都必须进行声明,一个类一旦被声明,就可以作为一个新的类使用。在C# 中通过使用class 关键字来声明类,声明语法如下。
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_23.jpg?sign=1738819703-q7IOXiMTuapq29SQBhy8LpNryQ5rK5up-0-039c31e59ca01bb17056d04227d48c10)
学习笔记
在声明类时,还可以指定类的修饰符和其要继承的基类或者接口等信息,这里只要知道如何声明一个最基本的类即可,关于类的详细内容,会在第7章中进行专题讲解。
在上面的语法中,在命名类的名称时,最好能够体现类的含义或用途,而且类名一般采用第一个字母大写的名词,也可以采用多个词构成的组合词。
例如,声明一个汽车类,命名为Car(该类没有任何意义,只演示如何声明一个类),代码如下。
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_24.jpg?sign=1738819703-fH93RDOQTMMkP6Xv0TXlHIjjG11Hom0l-0-bc81d17aa4970ade5939d0b579889aec)
2.2.3 关键字与标识符
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_25.jpg?sign=1738819703-sbj8Yh9PPBSrBtE5PkWQtTQw5rIrNfg4-0-19374bae6a0155a71a8f77fce80d5848)
1.关键字
关键字是C# 中已经被赋予特定意义的一些单词,在开发程序时,不可以把这些关键字作为命名空间、类、方法或属性等使用。输出 “Hello World” 程序中的using、namespace、class、static 和void 等都是关键字。C# 中的常用关键字如表2.1 所示。
表2.1 C# 中的常用关键字
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_26.jpg?sign=1738819703-n0ySVdnR1UlZVtFz99ZAoUpfC5xWtmnR-0-74f7d74c2147023efe65dcbeb9d74eda)
学习笔记
如果在开发程序时,使用C# 中的关键字作为命名空间、类、方法或属性等的名称,如下面代码使用C# 中的关键字void 作为类的名称,则会出现如图2.10 所示的错误提示信息。
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_27.jpg?sign=1738819703-v61IBmhjQODL50apRmYnVzrzi9CdaEuL-0-a354c1ff307583917c8834150b66b870)
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_28.jpg?sign=1738819703-TjmrOEJCPYVg1YZCvhAxpPmHAY3XYikT-0-91a8f36657746da77d86c27de93772f3)
图2.10 使用C# 中的关键字作为类名时出现的错误提示信息
2.标识符
标识符可以简单地理解为一个名字,比如每个人都有自己的名字,它主要用来标识类名、变量名、方法名、属性名、数组名等各种成员。
C# 标识符命名规则如下。
●由任意顺序的字母、下画线(_)和数字组成。
●第一个字符不能是数字。
●不能是C# 中的保留关键字。
下面是合法标识符。
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_29.jpg?sign=1738819703-XKGPipIBaaHj0F1hwnwMb9mbUvx6IqGJ-0-8e0d8a5c2f37b87a338ec8a4c5d2e2d7)
下面是非法标识符。
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_30.jpg?sign=1738819703-jPJ9qXFsYU9gtabUsxnSfclDM4RzEiIh-0-0202e9f96d9c4e23b91a2f377b750494)
学习笔记
在C# 中,标识符中不能包含#、%、$ 等特殊字符。
在C# 中,标识符中的字母是严格区分大小写的。两个相同的单词,如果大小写格式不一样,那么所代表的意义是完全不同的。例如,下面3 个变量是完全独立、毫无关系的,就像3 个长得比较像的人,彼此之间都是独立的个体。
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_31.jpg?sign=1738819703-MlS9YN9vqrr7NwGNBXOe8tYeyMY2tGSh-0-16b75bda1bf03552e686ea19209bdf77)
学习笔记
在C# 中允许使用汉字作为标识符,如 “class 运算类”,在程序运行时并不会出现错误,但建议读者尽量不要使用汉字作为标识符。
2.2.4 Main 方法
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_32.jpg?sign=1738819703-foqbfD0QCHoal9eMyElIvpUgse1QudSu-0-77be4d66cbc1e1d220cc1299a50438d9)
在Visual Studio 中创建控制台应用程序后,会自动生成一个Program.cs 文件,该文件有一个默认的Main 方法,代码如下。
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_33.jpg?sign=1738819703-zQ8UENeUFHlwsyExGJnCzC5j6Fyerxdu-0-a24d86e2e6d10974441ae1423fe2b67a)
每个C# 程序中都必须包含一个Main 方法,它是类体中的主方法,也称为入口方法,可以说是激活整个程序的开关。Main 方法从 “{” 开始,至 “}” 结束。static 和void 分别是Main 方法的静态修饰符和返回值修饰符,C# 程序中的Main 方法必须声明为static,并且区分大小写。
学习笔记
如果将Main 方法前面的static 关键字删除,则程序在运行时会出现如图2.11 所示的错误提示信息。
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_34.jpg?sign=1738819703-NUg405oR6y0C2CBchXfN0OzBiMThHtxM-0-b52c07add3a50c94d43d2d0ed66a033a)
图2.11 删除static 关键字时Main 方法出现的错误提示信息
Main 方法一般都是在创建项目时自动生成的,不用开发人员手动编写或修改。如果需要修改,则需要注意以下3 个方面。
● Main 方法在类或结构内声明,它必须是静态(static)的,而且不应该是公用(public)的。
●Main 方法的返回类型有两种:void 或 int。
●Main 方法可以包含命令行参数string[] args,也可以不包括。
根据以上3 个方面的内容可以总结出,Main 方法有以下4 种声明方式。
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_35.jpg?sign=1738819703-NvDJ41vZWL5eesKg0PgzqkQ6aadHV2D9-0-9abd277c06d46f585ea5113ddbe923e4)
学习笔记
通常在Main 方法中不写具体逻辑代码,只进行类实例化和方法调用(这好比手机来电话了,只需要按 “接听” 键就可以通话,而不需要考虑手机通过怎样的信号转换将电磁信号转换成声音)。这样的代码简洁明了,容易维护。养成良好的编码习惯,可以让程序员的工作事半功倍。
2.2.5 C# 语句
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_36.jpg?sign=1738819703-GohXyV5MdwGhqw2Vb6RXpGKvi0upOAmL-0-49b605e0b44abf7ea9f25d7c7e35420a)
C# 语句是构造所有C# 程序的基本单位,使用C# 语句可以声明变量和常量、调用方法、创建对象或执行任何逻辑操作。C# 语句以分号终止。
例如,在输出 “Hello World” 程序中输出 “Hello World” 字符串和定位控制台窗体的代码就是C# 语句。
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_37.jpg?sign=1738819703-wt446veot6YnfrHQw5Z7USw9fjDhqOTP-0-f32a8986b0dccb422380075e6a74d629)
上面的代码是两条最基本的C# 语句,用来在控制台窗体中输出内容和读取内容,它们都用到了Console 类。Console 类表示控制台应用程序的标准输入流、标准输出流和错误流,该类中包含很多方法,但与输入、输出相关的主要有4 个方法,如表2.2 所示。
表2.2 Console 类中与输入、输出相关的方法
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_38.jpg?sign=1738819703-bf745laUBCp5ru5DbHFXUycyuFUrprpI-0-d18e290eb2b4bc22ea3c395b59b401e4)
其中,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” 字符串,代码如下。
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_39.jpg?sign=1738819703-BkaPTDHcahbWMMD5JNQjJI4HJeYKEGEl-0-1f10e1ce0e910a6969567c978b9cf248)
代码的运行结果如图2.12 所示。
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_40.jpg?sign=1738819703-7JWP4WxjIJNlizVK29bYMshmQCF00gyn-0-d29ea843b8beb79b71466e0fa582e0c1)
图2.12 使用Console.Write 方法输出 “Hello World” 字符串代码的运行结果
●Console.WriteLine 方法:输出后换行。
例如,使用Console.WriteLine 方法输出 “Hello World” 字符串,代码如下。
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_41.jpg?sign=1738819703-yXf7O88eO3l74r0q8dGhGvRL772eQP67-0-575b5062647d2f6ceed0a37711596ed2)
代码的运行结果如图2.13 所示。
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_42.jpg?sign=1738819703-R1jjvSt13MP7SnW7j9FpycCnaqYeVU8H-0-06a68aadce17f395ba095410a0d76f04)
图2.13 使用Console.WriteLine 方法输出 “Hello World” 字符串代码的运行结果
学习笔记
C# 代码中所有的字母、数字、括号及标点符号均为英文输入法状态下的半角符号,而不能是中文输入法或英文输入法状态下的全角符号。例如,图2.14 所示为中文输入法的分号引起的错误提示信息。
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_43.jpg?sign=1738819703-KYO2mWZNoKI87tMOOeY7qq8eRvUMjpeE-0-1337d66906d35e16240b8996c06d1aee)
图2.14 中文输入法的分号引起的错误提示信息
2.2.6 注释
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_44.jpg?sign=1738819703-N8K8XivQgWNZXhirZ3EKJJrbM0qUpnEg-0-cd60f2ff2574e2aeb1a0092b1120e474)
注释是在编译程序时不执行的代码或文字,其主要功能是对某行或某段代码进行说明,以方便代码的理解与维护,或者在调试程序时将某行或某段代码设置为无效代码。常用的注释主要有行注释和块注释两种,下面分别进行简单介绍。
学习笔记
注释就像超市中各商品下面的价格标签,对商品的名称、价格、产地等信息进行说明,如图2.15 所示。而在程序中,注释的最基本作用就是描述代码的作用,告诉别人你的代码要实现什么功能。
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_45.jpg?sign=1738819703-S2xq1vwwDfGeWaVhC6GF823yFYOMyQx5-0-c4a8c91cb6bcb967ad39a2b8ce9aa288)
图2.15 超市中各商品下面的价格标签相当于注释
1.行注释
行注释以 “//” 开头,后面跟注释的内容。例如,在输出 “Hello World” 程序中使用行注释解释每行代码的作用,代码如下。
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_46.jpg?sign=1738819703-1lKXUTJdFxRNyEQT30N2ZqL2neYEGdyB-0-ea8496da309ac1f85a548ff6980d55ce)
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_47.jpg?sign=1738819703-TkDR8MRjdR87lvwDssJ3Ad5j1aKhdRZ1-0-4b2eb9468d1d94d56638f673042ee899)
学习笔记
注释可以出现在代码的任意位置,但是不能分隔关键字和标识符。例如,下面的代码注释是错误的。
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_48.jpg?sign=1738819703-NYMB83fA7RbBsjjKKkCaPdDHCey7IDXr-0-65a4f501e59a35fb8531feac8fd8f76f)
2.块注释
如果注释的行数较少,则一般使用行注释。对于连续多行的大段注释,则使用块注释。块注释通常以 “/*” 开始,以 “*/” 结束,注释的内容放在它们之间。
例如,在输出 “Hello World” 程序中使用块注释将输出 “Hello World” 字符串和定位控制台窗体的C# 语句注释为无效代码,代码如下。
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_49.jpg?sign=1738819703-Lu2hGlew1YYLsNj7si4zRMaSHVYVVMkO-0-5a5d4ee0f0b439dcb8a3ec1951f030e0)
学习笔记
块注释通常用来为类文件、类或方法等添加版权、功能等信息。例如,下面的代码使用块注释为Program.cs 类添加版权、功能及修改日志等信息。
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_50.jpg?sign=1738819703-45w5uWBqgIqRgE2jYlBCIyM3jJBOF5sb-0-ebac98277ad492faf0e7f4d7dc750b4b)
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_51.jpg?sign=1738819703-JCpG0huroNpdnIRdBx1RZLy9LgWzoOE7-0-e4468dbda275885a35a620d0c83b4413)
2.2.7 一个完整的C# 程序
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_52.jpg?sign=1738819703-PdoSdi2xk3cKlmv9rOAVxQP7o63DGIeG-0-19a944938e4f8d771b3552c13b719835)
通过以上内容的讲解,我们熟悉了C# 程序的基本组成,下面通过一个示例讲解如何编写一个完整的C# 程序。
示例2.输出软件启动页
使用Visual Studio 2017 创建一个控制台应用程序,然后使用Console.WriteLine 方法在控制台模拟输出 “编程词典(珍藏版)” 软件的启动页,代码如下。
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_53.jpg?sign=1738819703-GThBboZdGcgGlDagNsL5u7z8xOlckf5y-0-cade90f5ce4ec91baf0bf35e2598570b)
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_54.jpg?sign=1738819703-KhEewCKpPSh5pCe3VpIfZqVMyMtd6EKw-0-3acfdb5bb3dae6468c40278a3bcc1662)
完成以上操作后,单击Visual Studio 2017 工具栏中的图标按钮即可运行上面的代码,代码运行结果如图2.16 所示。
![img](https://epubservercos.yuewen.com/03FE8C/19471983108810806/epubprivate/OEBPS/Images/txt003_56.jpg?sign=1738819703-6AH6LgjWNpz5PxZdNpEOxs6u7oikV0Pb-0-022dd3e51b7501fcf4961553df5ad66b)
图2.16 输出软件启动页代码运行结果