![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=1739247132-ztYi9pc6u1SiZD4ry7pwqM7RKrFleK8G-0-173ad29d07097382af551968df8d5907)
1. 命名空间
命名空间是.NET中提供应用程序代码容器的方式,这样就可以唯一地标识代码及其内容。
在C#中,创建命名空间的关键字是namespace,在运行Visual Studio 2017时会自动加入命名空间,格式为namespace空间名称。命名空间是以“层”形式存在的,如果有多层,则以“.”分开。
例如:
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T34_66066.jpg?sign=1739247132-vW2V65krmmUbWyye6l8rka37i4cSLUAw-0-fdbf5c0213a12fb71256ddfa9aca8951)
在引用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=1739247132-frF12eMzyjc0BDUa6oV9mXVypSUVLsxz-0-9cad2d84da069024968db18023dcd86e)
【例2-2】编写程序,通过别名引用命名空间。
(1)在Visual Studio 2017中,新建名称为“Project2”的文件。
(2)在代码编辑区域输入以下代码。
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T34_66068.jpg?sign=1739247132-VEvAQiDUhL5TmvPrVhTsmWzhuSuUbCRx-0-6daaae6be57acc010daa9483b4ef7431)
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-P34_4995.jpg?sign=1739247132-DArtCdTFFWmuRWsNYJ3AmWSHHIYRCJGU-0-6e9ac0ec71115afd2783052c0f2427e4)
图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=1739247132-zxCuPZpP8bmEwV3VcbvQNLux0Tx5Bd2k-0-ff650637fade9d04fb89f16dba36312c)
4. 上下文关键字
上下文关键字仅在受限制的程序上下文中具有特殊含义,并且可在该上下文外部用作标识符。但是它不是C#中的保留字,用户可以将这些关键字用作自己的方法、变量和类的标识符,如下所示。
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T35_66077.jpg?sign=1739247132-ihrIzYOV6uAQIlGHN11yQQQUTcA3CZAu-0-28de62c7122493f087742ff35d58accb)
注意:在Visual Studio 2017的代码和文本编辑器窗口中输入这些关键字时,它们的颜色默认为蓝色。
2.2.2 类名
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-P35_5029.jpg?sign=1739247132-r2AdRiFNSjZLICxebzU0OUjNg4hOFsg4-0-efc25f2929dd7b6a7a9dc510a0998877)
当用户定义一个类时,就表示定义了一个数据类型的蓝图。这实际上并没有定义任何的数据,但是它定义了类的名称,这就意味着类的对象由什么组成以及在这个对象上可执行什么操作。对象是类的实例。构成类的方法和变量称为类的成员。
C#中所有的语句都必须位于类的内部。因此,类是C#语言的核心和基本构成模块。C#支持自定义类,使用C#编程就是编写自己的类来描述实际需要解决的问题。
类的定义是以关键字class开始,后跟类的名称。类的主体,包含在一对花括号内。下面是类定义的一般形式:
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T35_66078.jpg?sign=1739247132-6q4tNmcX8DOdHfppNR4zH32F6IOL2NpF-0-3ea535f0e22d64b23e26f8a8979cb61b)
注意:
(1)类修饰符指定了对类及其成员的访问规则。如果没有指定,则使用默认的访问标识符。类的默认访问标识符是internal,成员的默认访问标识符是private。
(2)在C#中,类名是一种标识符,必须符合标识符的命名规则。类名要能够体现类的含义和用途,类名一般采用第一个字母大写的名词,也可以采用多个词构成的组合词。
(3)如果要访问类的成员,用户要使用点“.”运算符。点运算符连接了对象的名称和成员的名称。
例如,声明一个简单的类,该类没有任何意义:
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T36_66082.jpg?sign=1739247132-1hmzuO2XKWTa2kYqaEHvARmduDuoPopu-0-1badcc4b387e7bf5309b71b3f45d956f)
2.2.3 Main方法
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-P36_5142.jpg?sign=1739247132-vwNqtp1yeQJbQwxkHLI6rN6SkZKLZF3r-0-a341e333f0e53614e62e554253f08451)
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=1739247132-UGZLC0SIZTFYpKaRntWUvQeedAdp9BDu-0-97592af1c58d82d4e73ac9271a4463ef)
这并不是唯一的Main方法的形式,以下的Main方法作为程序的入口点都是被允许的。
(1)整型返回类型,以字符串数组作为参数。
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T36_66084.jpg?sign=1739247132-aQSLsbRXwsyi1fO4AgNQU8Qb4GtnYCW4-0-54ab03ccbe22f670ecccf622a691366d)
(2)没有返回值,没有参数。
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T36_66085.jpg?sign=1739247132-mwJUiLZCWUFICA4dfnIOGfmYT5EUZujB-0-0eed04e1e5a0e7cfa6efea35b897bf00)
(3)整型返回类型,没有参数。
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T37_66086.jpg?sign=1739247132-nbT2lYrDojRew2hj8Blj9HU7d2Ej9PET-0-ef13b795bf3c8b98fdda585b853fab55)
注意:如果不给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=1739247132-1DDiQqkLo3lgUZaXBt805rNGB0MLYKsu-0-75c2c20aa59b3062a9530bbe2ca6cfa9)
注释用于解释代码。编译器会忽略注释的条目。在C#程序中,多行注释以“/*”开始,并以字符“*/”终止,如下所示:
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T37_66088.jpg?sign=1739247132-BdqgRVvjoqWBUzux4Gx5tPKI7ECC98wU-0-b32ddb64272bc50e111f7d1d6d6cdf37)
单行注释是用“//”符号表示。
例如:
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T37_66089.jpg?sign=1739247132-f1Bj5HPihxsrTK0hYllKSQMiojprbQq6-0-f73a031fa309484c9dc6f90f2bca677a)
2.2.5 C#语句
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-P37_5233.jpg?sign=1739247132-C4Qp5w3OUQ728MemHzFdhAXKQEFNeTBk-0-71f2d1cde07e9da8b1d32acffdbf8e87)
程序执行的操作采用语句表达。常见操作包括声明变量、赋值、调用方法、循环访问集合,以及根据给定条件分支到一个或另一个代码块。语句在程序中的执行顺序称为“控制流”或“执行流”。根据程序对运行时所收到的输入的响应,在程序每次运行时控制流可能有所不同。
语句可以是以分号结尾的单行代码,也可以是语句块中的一系列单行语句。语句块括在大括号“{}”中,并且可以包含嵌套块。
下面列出了C#中的各种语句类型及其关联的关键字。
(1)声明语句。声明语句引入新的变量或常量。变量声明可以选择为变量赋值。在常量声明中必须赋值。
例如:
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T37_66090.jpg?sign=1739247132-elTCTnE9XjKxrsMXawCp6GYBMT55V1kp-0-f14c0ccad74d6c523618634f768931e2)
(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=1739247132-lUm3XGiCAThUvZwb7XiZCWw62JdXe1LR-0-af0d7edc0d15d4aac499cc97d5c79abd)