![C# 从入门到项目实践(超值版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/707/27111707/b_27111707.jpg)
2.2 C#基本语法
C#是一种面向对象的编程语言。在面向对象的程序设计方法中,程序由各种相互交互的对象组成。相同种类的对象通常具有相同的类型,或者说是在相同的class中。
2.2.1 命名空间、标识符及关键字
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-P33_4885.jpg?sign=1739292717-yPjde6numpYhckHfs9Db4USBBOkdktTj-0-0e4abaf2437de7da147851bfc981c310)
1. 命名空间
命名空间是.NET中提供应用程序代码容器的方式,这样就可以唯一地标识代码及其内容。
在C#中,创建命名空间的关键字是namespace,在运行Visual Studio 2017时会自动加入命名空间,格式为namespace空间名称。命名空间是以“层”形式存在的,如果有多层,则以“.”分开。
例如:
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T34_66066.jpg?sign=1739292717-PuJPK0tYnbrG04mHbXdjURnUf7E0qUT2-0-155101c4cbab5a0c66e05f448399720d)
在引用Generic命名空间时,需要引用System命名空间,然后再引用Collections命名空间。这就好比每层包含的文件夹,打开System文件再打开Collections文件,就找到Generic文件了。
在引用命名空间时需要注意以下两点:
(1)有时命名空间相当长,输入时很烦琐,则可以使用using关键字,在文件的顶部列出类的命名空间,这样引用一个命名之间后,访问其空间内的方法就如同向在其类内访问一样。
(2)using还有另一个作用,就是给命名空间一个别名。如果命名空间的名称非常长,又要在代码中使用多次,而用户不希望该命名空间的名称包含在using指令中,这时就可以给该命名空间指定一个别名。
其语法如下:
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T34_66067.jpg?sign=1739292717-WywIEhz7qYAFs42VUixnyYHSSd2unnfO-0-fbf6903d68a7c324cd45f0588c5fbbbb)
【例2-2】编写程序,通过别名引用命名空间。
(1)在Visual Studio 2017中,新建名称为“Project2”的文件。
(2)在代码编辑区域输入以下代码。
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T34_66068.jpg?sign=1739292717-tpms7Q4aMOuM5fBXWosttV1sOpSanUK6-0-39070236e1406aba71fdd085b9d046ba)
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-P34_4995.jpg?sign=1739292717-WQN5JgKUcRYdsx9ewV6vmqDsxw0urxnP-0-a02fbdd126677c7f52d1cad5f0b5dacf)
图2-2 引用命名空间
【程序分析】本例演示了通过别名引用命名空间。在代码的开头部分,使用using指令声明一个别名MK,代替System命名空间中的Console类。然后在Project2命名空间的Main方法中,使用MK,引用WriteLine方法,并输出一段语句。
在Visual Studio 2017中的运行结果如图2-2所示。
2. 标识符
标识符是程序编写人员为常量、变量、数据类型、方法、函数、属性、类、程序等定义的名称。在命名标识符时应当遵守以下规则:
(1)标识符不能以数字开头,也不能包含空格。
(2)标识符可以包含大小写字母、数字、下画线和@字符。
(3)标识符必须区分大小写。大写字母和小写字母被认为是不同的字母。
(4)@字符只能是标识符的第一个字符。带@前缀的标识符称为逐字标识符。
(5)不能使用C#中的关键字。但是,@字符加关键字可以成为合法的标识符,建议不要这样做。
(6)不能与C#的类库名称相同。
3. 关键字
关键字对于C#编译器而言,是具有特定含义的名称,例如程序中的using、class、static、void都属于关键字。如果错误地将关键字用作标识符,编译器会产生错误,用户马上就会知道出错了,所以不必担心。但是,如果用户想使用这些关键字作为标识符,可以在关键字前面加上@字符作为前缀。
下面列出了C#中所有的保留关键字。
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T35_66075.jpg?sign=1739292717-XAIDuIAFEzmxIuCmE8Nx6gZAV3Hp6VAV-0-7f2e1ee426bb9f085822ca555dd063ab)
4. 上下文关键字
上下文关键字仅在受限制的程序上下文中具有特殊含义,并且可在该上下文外部用作标识符。但是它不是C#中的保留字,用户可以将这些关键字用作自己的方法、变量和类的标识符,如下所示。
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T35_66077.jpg?sign=1739292717-UrUGmCKUR3g9eUoa7UVbkwDUfw1Iou4m-0-ee0b85cb4153a412f41277ccaf26d6bd)
注意:在Visual Studio 2017的代码和文本编辑器窗口中输入这些关键字时,它们的颜色默认为蓝色。
2.2.2 类名
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-P35_5029.jpg?sign=1739292717-bfrZ7PtJIWO812ZmwXHicTwYRTfjHicH-0-3691a54c80a30778accbd1f25a2ea3a1)
当用户定义一个类时,就表示定义了一个数据类型的蓝图。这实际上并没有定义任何的数据,但是它定义了类的名称,这就意味着类的对象由什么组成以及在这个对象上可执行什么操作。对象是类的实例。构成类的方法和变量称为类的成员。
C#中所有的语句都必须位于类的内部。因此,类是C#语言的核心和基本构成模块。C#支持自定义类,使用C#编程就是编写自己的类来描述实际需要解决的问题。
类的定义是以关键字class开始,后跟类的名称。类的主体,包含在一对花括号内。下面是类定义的一般形式:
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T35_66078.jpg?sign=1739292717-nRlmzvYGieaDRjqOwygC3T78fi2We0If-0-4367c932ab46a97e184e9ec787601925)
注意:
(1)类修饰符指定了对类及其成员的访问规则。如果没有指定,则使用默认的访问标识符。类的默认访问标识符是internal,成员的默认访问标识符是private。
(2)在C#中,类名是一种标识符,必须符合标识符的命名规则。类名要能够体现类的含义和用途,类名一般采用第一个字母大写的名词,也可以采用多个词构成的组合词。
(3)如果要访问类的成员,用户要使用点“.”运算符。点运算符连接了对象的名称和成员的名称。
例如,声明一个简单的类,该类没有任何意义:
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T36_66082.jpg?sign=1739292717-XuwLuPIE9ajnaBwyWIpkQH1v4o7Lfqe7-0-754f893fe8b021afe8cd9a496c503f07)
2.2.3 Main方法
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-P36_5142.jpg?sign=1739292717-MeIVe0ejILOqZXAMEBsLjGVqqYy8kX61-0-9e52f75e6f797417d586869414b59f66)
1. Main方法简介
(1)一般情况下,一个C#可执行程序只有一个应用程序对象(也就是程序入口),但是在某些情况下,可能会有多个应用程序对象(程序入口),如单元测试中,这个时候就需要通过命令行指定以哪个Main方法作为程序的入口。
(2)分析Main方法,用户可以发现Main方法通过static修饰,这主要是让用户可以通过类名加方法的形式调用Main方法,用户在调用之前不需要创建对象的实例(也就是new出该对象)。
(3)分析Main方法的参数是一个字符串(string[] args),这个参数可以包含任意数量的命令行输入参数。
2. C#中Main方法的形式
在默认情况下,Visual Studio 2017生成的Main方法有一个void返回值,并且只接收一个参数(一个字符串数组,用于接收任意数量的命令行输入参数)。
例如:
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T36_66083.jpg?sign=1739292717-4wjiTqfl9KryxXALt6GEBqr2fpH0n4RB-0-191a99cf57c85b05b211574fc89ee658)
这并不是唯一的Main方法的形式,以下的Main方法作为程序的入口点都是被允许的。
(1)整型返回类型,以字符串数组作为参数。
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T36_66084.jpg?sign=1739292717-NbLd09YnXCbyfmvPqj7qhvGujR4ZSEPi-0-be930a6bb2b216f3514714c44bf2715d)
(2)没有返回值,没有参数。
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T36_66085.jpg?sign=1739292717-88qo7rOIAu8yuYvXvvKUFGvl3txP5lWe-0-9bcfa641f823e68af841fb1b74a85e22)
(3)整型返回类型,没有参数。
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T37_66086.jpg?sign=1739292717-WCj93167AU0NhHtKjgc7hauLN1aKTlIG-0-aa7390eee748216dd66e5c9bfec48462)
注意:如果不给Main方法提供一个修饰符,那么Main方法默认就是私有的,当然Main方法可以定义成共有的,但是Visual Studio 2017会把程序的Main自动定义成隐式私有的,以确保其他程序不能直接调用另一个程序的入口点。
3. Main方法返回错误
绝大多数的Main方法会以void作为返回值,但是C#和其他C类型的语言一样,都可以从Main返回一个int。根据惯例,返回值0表示程序正常结束,而其他值(如-1)表示程序有异常发生。
2.2.4 代码注释
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-P37_5232.jpg?sign=1739292717-EZcwYC6LwtBq7vwqRfXYcNOsxfJud5u2-0-5d65447aeccf3bbaa226864a8a1b736a)
注释用于解释代码。编译器会忽略注释的条目。在C#程序中,多行注释以“/*”开始,并以字符“*/”终止,如下所示:
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T37_66088.jpg?sign=1739292717-SRN8Yh2CWNbTz3XbopH3UMqSzzy6B4Um-0-9db16a0cbf37bb8a033a3f7a7ea783ff)
单行注释是用“//”符号表示。
例如:
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T37_66089.jpg?sign=1739292717-I65f1VDFoGkpT1OaVQEc7uo76W4xFIFh-0-bc8215621357430174d0d77550ebca09)
2.2.5 C#语句
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-P37_5233.jpg?sign=1739292717-zobsR9qBpEXn00guZxbS3omrYUlziLlT-0-b662f935d9fc290893cbf26f648a83a1)
程序执行的操作采用语句表达。常见操作包括声明变量、赋值、调用方法、循环访问集合,以及根据给定条件分支到一个或另一个代码块。语句在程序中的执行顺序称为“控制流”或“执行流”。根据程序对运行时所收到的输入的响应,在程序每次运行时控制流可能有所不同。
语句可以是以分号结尾的单行代码,也可以是语句块中的一系列单行语句。语句块括在大括号“{}”中,并且可以包含嵌套块。
下面列出了C#中的各种语句类型及其关联的关键字。
(1)声明语句。声明语句引入新的变量或常量。变量声明可以选择为变量赋值。在常量声明中必须赋值。
例如:
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T37_66090.jpg?sign=1739292717-9Q6XZ4ZMvdBf1VN4of4oElUSSsRFOoeB-0-0b0675f4c4834d68b95eae1e0e217c9d)
(2)表达式语句。用于计算值的表达式语句必须在变量中存储该值。
(3)选择语句。用于根据一个或多个指定条件分支到不同的代码段。这一类语句包括if和switch语句。
(4)迭代语句。用于遍历集合(如数组),或重复执行同一组语句直到满足指定的条件。这一类语句包括while、do、for和foreach语句。
(5)跳转语句。用于将控制转移给另一代码段。这一类语句包括break、continue、goto、throw、return和yield语句。
(6)异常处理语句。用于从运行时发生的异常情况正常恢复。这一类语句包括throw、try…catch、try…finally和try…catch…finally。
try…catch语句用于捕获在代码块执行期间发生的异常,try…finally语句用于指定始终执行的最终代码,无论异常发生与否。
(7)checked和unchecked。用于指定将结果存储在变量中但该变量过小而不能容纳结果值时,是否允许数值运算导致溢出。
(8)using语句。用于获取资源,执行语句,然后释放资源。
(9)空语句。空语句只含一个分号,不执行任何操作,可以在需要语句但不需要执行任何操作的地方使用。
例如:
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T38_66092.jpg?sign=1739292717-ntQ4dy27XbkSiUcRDoPY6RL4lTrPD1KA-0-03f1e4fae8a5b1c178ad10d256d76ddb)