2.3 详细介绍
接下来,我们将对代码清单2-1进行详细说明。代码虽然简单,但涉及几个重要的知识点,可谓:“麻雀虽小,五脏俱全”。在后面的章节中,我们也将使用很多的示例代码进行辅助说明,这里先提前介绍一些基础知识。
第1行使用了System命名空间(Namespace)。什么是命名空间呢?如果你以前学习过Java,那么这里的命名空间就相当于Java中的“包(Package)”,形象表示如图2-7所示。
图 2-7 命名空间和类(1)
可见命名空间中有一个或多个类,当然也可以包含其他类型,例如接口、结构等,关于命名空间的详细知识,请参阅第22章。这里以类和命名空间的关系为例,一个类可以不在任何命名空间中,一个命名空间也可以没有任何类,但是一旦将类声明于一个命名空间,则最多只能属于一个命名空间,而一个命名空间可以包含多个类。为什么要引入命名空间这样一个概念呢?主要起分类和限定的作用,假如有两个名叫C的类,那么编译器怎么知道我们需要使用的是哪个呢?这时命名空间的作用就显示出来了,可以将它们放置于两个不同的命名空间中:例如N7和N8,那么就可以使用N7.C和N8.C(全限定名)来对它们进行区分,如图2-8所示。
图 2-8 命名空间和类(2)
当大家了解了什么是命名空间以及它的作用后,我们就来分析一下代码清单2-1中有哪些部分与命名空间有关。
第1行:using关键字的作用就是使用System命名空间,也就是告诉编译器,当碰到未知的类时到哪里去找。或者换句话说,使用了using关键字引入了System命名空间,那么当使用该空间中的Console类时,就不需要使用System.Console这样的名称,而直接使用Console即可。
第3行:namespace关键字是定义一个命名空间,从第4行开始一直到第12行,大括号({})中所有的内容都位于该命名空间之中。
第5行:class关键字定义了一个类。什么是类(class)?类是一种类型,它封装了一些数据和一些方法。从面向对象的观点来看,类就是一个责任和数据的综合体。代码的第5行到第11行定义了一个类,类名叫做HelloWorldClass,它只有一个静态的入口方法Main()。关于类的更多信息,请参阅第9章。
第7行:这里定义的是一个Main方法,它是类HelloWorldClass的唯一方法成员。方法体从第8行开始,一直到第10行结束。Main方法不是一个普通的方法,它是一个类的入口,所谓入口就是说执行过程开始时,它由CLR自动调用,因此Main方法必须遵循一定的定义规则。Main()方法是执行过程的开始,当方法执行结束也就意味着执行过程结束。
第9行:C#语言本身没有类库,因此它需要.NET框架提供的类库,也就是在第1章中讲的BCL。这里的Console类就是我们经常使用的控制台对象,使用该类可以将数据输出到控制台。其中,WriteLine是Console对象的静态方法,负责输出内容到控制台。Console类位于System命名空间,它的全限定名[1]是:System.Console,这里之所以没有使用全限定名,秘密就在第一行的代码:"using System;",所以CLR会自动在System命名空间中查找Console类。
我们可以尝试删掉第1行代码,此时CLR将不知道去哪里寻找Console类,这将产生编译错误。但Visual Studio 2010的代码提示功能(IntelliSense)可以协助我们导入正确的命名空间,如果选择不导入命名空间,也可以选择使用类的全限定名——"System.Console",如图2-9所示。
图 2-9 Visual Studio的代码提示功能
提示 如果你的Visual Studio没有代码提示,请打开Visual Studio的Options选项窗口,依次定位到"Text Editor"→"C#"→"Statement completion"选项,然后选中"Auto list members"。
图2-10演示了Main方法,并给出了Main方法的4种不同形式。
图 2-10 Main()方法的4种形式
如图2-9所示,Main()方法的4种形式体现在它有4种不同的签名。从是否有返回值的角度来分,A、B为一组,C、D为一组;从是否有参数的角度来分,A、C为一组,B、D为一组。如果使用C、D的形式,返回值是一种运行结果的状态提示。一般情况,返回值为0表示程序正常结束,为1则表示非正常结束。Main()方法的args参数是一个字符串数组,存储的是该应用程序执行时后面所带的参数,如图2-11所示。
图 2-11 Main()方法的参数
如图2-11所示,此时args字符串数组有两个元素:
❑args[0]的值为localhost;
❑args[1]的值为Message。
注意 Main()方法为静态方法,注意不要写作main()方法,C#语言对大小写敏感。
[1]类的全限定名是指包括了类所在空间的名称,使用公式简单说明:全限定名=类所在的命名空间+类名。例如:Console类的全限定名为System.Console。