1.4 解析一个简单的C#程序
图1-1展示了一个最简单的C#应用程序。
图1-1 剖析一个简单的C#程序
下面逐一讨论该程序的关键元素。
1.4.1 “using System;”语句
程序的第一行,
using System;
是让程序得以正确编译和运行的必要条件,它向编译器提供在System名称空间中定义的类型信息;名称空间(namespace)是一系列预定义C#编程元素的逻辑组合(在C#中是FCL的一部分)。我们到第13章才详细说明名称空间的细节;现在,只要记得 using System; 语句是让我们的程序(特别是Console.WriteLine(“Hello!”);这行)正确编译的必要条件就行了。
using是一个C#关键字;关键词也被叫做保留字,代表一种编程语言中有特殊意义的字词,程序员不能用这些字词来做变量名、函数名或任何你将学到的其他C#构成块的名称。在本书中我们还会遇到许多C#关键字;附录E给出了C#关键字的完整列表。
1.4.2 注释
程序的后面一行是注释。
// 本例演示一些基本C#语法。
C#支持三种不同的注释风格;这里我们看看其中两种。
C风格的注释块由右斜杠加上星号开头(/*),由星号加上右斜杠结束(*/)。在它们中间的任何字符都被当作注释,被编译器忽略掉,不管有多少行注释都是如此。
/*这是单行的C风格注释*/
/* 这是多行的C风格注释。这样可以暂时
注释掉整段代码,而不直接删除它们。
当编译器遇到第一个“斜杠星号”时,
它将把后续的内容,甚至包括代码行,
都看作注释,直至遇到下个“星号斜杠”。
x = y + z;
a = b / c;
j = s + c + f;
*/
C++式的单行风格注释使用双斜杠(//)来注释一行,如下所示:
x = y + z; // 注释文本直至行末
a = b / c;
// 这里是由一系列C++风格(单行)注释组成的注释块。
// 它可作为C风格代码块。
// 的对等代换物。(/*……*/)
m = n * p;
另外还有一种C#注释,用在XML文档中,不过已经超出本书讨论范围。
注意,注释不能嵌套。如下面的代码无法通过编译:
/* 注释开始……
x = 3;
/* 哇!在第一个注释结束前,我们错误地企图嵌套第二个注释!
这将导致编译问题,因为编译器将忽略第二个(那个嵌套的)注释开始符。
我们已经位于一个注释中!编译器遇到第二个注释结束符时,会以为
是遇到了第一个注释结束符…… */
z = 2;
*/
在上例中,当编译器在末行遇到我们希望的“外围”注释结束符(*/)时,将报告类似下列编译错误:
error CS1525: Invalid expression term“/”
error CS1002: expected;
1.4.3 类声明/“包装”
下面介绍类的“包装(wrapper)”——更正确的名称是类声明,其形式如下:
public class name
{ ... }
等等。如:
public class SimpleProgram
{ ... }
花括号中是程序的主要逻辑,同时也包括类的其他构成块;在后续章节中,你将学习到类的其他知识,例如如何命名类,为什么一开始就需要类包装,等等。现在只要记住,public和class是C#的关键字,而SimpleProgram则是我们发明的名称。
1.4.4 Main方法
在SimpleProgram类声明里,我们可以看到程序的起始函数,在C#中被叫做Main方法(Main method)。Main方法是C#程序的入口点。运行程序时,系统将调用Main方法,
启动我们的应用程序。
对于上例这样简单的程序,所有处理逻辑可以在单个方法中包括。对于更复杂的应用程序,Main方法就可能无法包括整个系统的全部处理逻辑了。在后面的章节中,你将学习到如何突破Main方法的局限。
Main方法的第一行如下:
statoid void Main() {
该行定义了Main方法的头(header),而且必须像范例中那样写(第13章里面我们会提到一个例外,即在需要接受命令行参数时的情况)。
我们的Main方法体(用花括号包含的那部分)中,包括单行语句:
Console.WriteLine("Hello!");
它输出信息
Hello!
到屏幕上。以后我们再探讨该语句的语法,现在请先留意语句结尾的分号。如同在C、C++和Java中那样,分号放置在单个C#语句的末尾。用花括号{……},把代码块分隔开。在本章稍后的“代码块和变量作用范围”部分中,我们再详细讨论它。
在更复杂的程序中,我们往往还会在Main方法内声明变量、创建对象和调用其他方法。
好了,我们已经见过了简单的C#程序,现在来探索一些基本的C#语法特点。