第1章 类和对象

面向对象程序设计(Object-Oriented Programming,OOP)是一种程序设计架构,同时也是一种程序开发的方法。对象指的是类的实例,它将对象作为程序的基本单元,将程序和数据封装其中,以提高代码的重用性、灵活性和扩展性。

978-7-111-60561-4-Chapter01-1.jpg

1.1 面向对象的概念

世界是由什么组成的?现实世界是由一个一个对象组成的,例如看到的东西、听到的事件、想到的事情,这些都是对象,也就是说万事万物皆对象。不同的对象,既相互独立,又相互联系,人们面向的世界就是“面向对象”的。

1.1.1 对象抽象成类

对象(Object)抽象为类(Class)的过程,是在系统分析阶段完成的。

978-7-111-60561-4-Chapter01-2.jpg

1.分析对象的特征

对象是人们要分析的任何事物,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件,不同的对象呈现不同的特征。由于对象反映了现实世界,人们通过面向对象的方法就可以找到合理地解决问题的方法。怎样区分这些对象呢?就是分析与系统相关对象的特征,包括状态(静态特征)和操作(动态特征)。如图1-1所示为对象的部分特征的分析。

978-7-111-60561-4-Chapter01-3.jpg

图1-1 对象的部分特征

状态:用于描述对象的静态特征,表示对象“是什么样子”。对象的状态用一些数据来描述,在程序中称为字段或属性。

操作:用于描述对象的动态特征,表示对象“能做什么”。对象的操作用于改变对象的状态,对象的操作就是对象的行为,在程序中称为方法或函数。

对象实现了状态和操作的结合,使状态和操作封装在一个对象之中,如图1-2所示。

978-7-111-60561-4-Chapter01-4.jpg

图1-2 对象的特征

2.对象抽象成类

抽象就是从特定角度出发,从已经存在的事物中提取现实世界中某事物的关键特性,为该事物构建模型的过程。对同一事物在不同的需求下,需要提取的特性可能不一样。得到的抽象模型中一般包含:状态(属性)和操作(方法或函数),这个抽象模型称为类。

现实世界中的事物都可以抽象成应用系统软件中的对象,提取出人们所关注的对象。对这些对象再分析与应用系统相关的特征,对不同特征的对象进行分类,把具有相同或相似特征的对象进行归类,即抽象成类,如图1-3所示。

例如,要研发一款学校管理系统软件,依据学校中的对象的特征,分为人、场馆、物品、课程等类别。学校中的“人”,根据特征又可分为管理人员、教师、后勤人员、学生等类别,这种“类别”在面向对象中称为“类”。类是具有相同状态和操作的一组对象的集合。

类是对象的抽象,仅仅是模板,比如说“人”类。对类进行实例化得到对象,对象是一个一个看得见、摸得着的独一无二的具体实体,一个对象具有唯一的状态和操作,如图1-4所示。

978-7-111-60561-4-Chapter01-5.jpg

图1-3 由对象抽象成类

978-7-111-60561-4-Chapter01-6.jpg

图1-4 类与对象

面向对象技术利用“面向对象思想”去描述“面向对象的世界”。面向对象是把问题分解成各个对象,在系统分析阶段把这些对象抽象成不同的类,建立类和描述这类对象在解决问题时的特征(状态和操作),形成类模板。其中的操作,在类定义中是用方法来实现的。

【课堂练习1-1】指出下面词语哪些是类?哪些是对象?

笔记本电脑 院中的那辆白色轿车 员工 同事小李

汽车 大象 我家的小狗 越野车

我的手机 我选的本学期的课程 我选的C#课程 教师

【例1-1】使用面向对象的思想描述并抽象出学生类。

功能描述:常用的学生信息有姓名、性别、年龄、班级等基本信息,学习完一门课程后需要参加考试,只有考试通过后才能进入下一门课的学习。

请根据描述,从对象抽象出学生类。要求定义学生类,并在主方法中实例化学生对象。

思路分析如下。

1)分析问题:学生学习课程。

2)提炼对象:学生。

3)分析对象的状态:姓名、性别、年龄、班级等。

4)分析对象的操作:学习、考试等。

5)定义类:学生类Student。

状态:

姓名name

性别gender

年龄age

班级grade

操作:

显示学习的课程Study(course),course是显示的课程名称

显示考试的课程Exam(course,score),course课程,score成绩

【课堂练习1-2】请使用面向对象的思想描述并抽象出“台湾烧仙草奶茶连锁店”的类。

功能描述:不同的“台湾烧仙草奶茶连锁店”具有相同的环境、奶茶品种、价格、服务等,显示某编号奶茶店的信息。

【例1-2】使用面向对象的思想描述长方体类。

功能描述:长方体有3条棱,分别叫作长方体的长,宽,高。用这3条棱既能描述一个长方体,也可以计算长方体的体积、表面积。

思路分析如下。

1)分析问题:用长方体的3条棱就能描述一个长方体,计算长方体的体积、表面积。

2)提炼对象:长方体。

3)分析对象的状态:长,宽,高。

4)分析对象的操作:计算长方体的体积、表面积。

5)定义类:长方体类Cuboid。

状态:

长length

宽width

高height

操作:

计算长方体的体积Cubage,长方体的体积=长×宽×高

计算长方体的表面积TotalArea,长方体的表面积=(长×宽+长×高+宽×高)×2

1.1.2 由类创建对象

978-7-111-60561-4-Chapter01-7.jpg

在编程阶段,由类模板生成(或创建)对象(实例),如图1-5所示。

类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。类是用于创建对象的蓝图,它是一个定义包括在特定类型对象中的方法和变量的模板。例如,由“人”类创建“刘强”“王芳”对象,如图1-6所示。

978-7-111-60561-4-Chapter01-8.jpg

图1-5 由类创建对象

978-7-111-60561-4-Chapter01-9.jpg

图1-6 创建对象

类是具有相同状态(特征)和操作(方法或函数)的一组对象集合。类是对象的类型,不同于基本数据类型(例如,int类型),类具有操作。对象是一个能够看得到、摸得着的具体实体。

1.1.3 对象之间的通信

对象之间的通信称为消息,如图1-7所示。在对象的操作中,当一个对象的消息发送给某个对象时,消息包含接收对象去执行某种操作的信息。发送一条消息至少要包括说明接受消息的对象名、发送给该对象的消息名(即对象名、方法名)。

978-7-111-60561-4-Chapter01-10.jpg

图1-7 对象之间的通信

面向对象的思想就是以对象为中心,先开发类,然后实例化对象,通过对象之间相互通信实现功能。

1.1.4 面向对象开发的特点

面向对象开发就是采用“现实模拟”的方法设计和开发程序,面向对象是把问题分解成各个对象,描述这个对象在解决问题时的状态和操作。面向对象技术利用“面向对象的思想”去描述“面向对象的世界”。面向对象开发的主要特点如下。

1)虚拟世界与现实世界的一致性。

2)客户与软件开发师交流更顺畅。

3)软件开发人员内部交流更顺畅。

4)代码重用性高,可靠性高,开发效率高。

1.2 定义类、创建对象

在编程时,要先定义类,然后再创建这个类的对象(实例)。

1.2.1 定义类

定义类的语法格式如下。

978-7-111-60561-4-Chapter01-11.jpg

各项的含义如下。

978-7-111-60561-4-Chapter01-12.jpg

1)“访问修饰符”用来限制类的作用范围或访问级别,类的修饰符只有public和internal两种(嵌套类除外)。其中,声明为public的类可以被任何其他类访问;声明为internal的类只能从同一个程序集的其他类中访问,即只有当前项目中的代码才能访问。若省略访问修饰符,则默认为internal。

2)“类名”的命名与变量命名规则相同,类名使用Pascal命名规范。类名使用能够反映类功能的名词或名词短语。单独定义的类文件名要能反映类的内容,最好是与类同名。

1.2.2 类的成员

在类的定义中,类的成员包含字段成员、方法成员等。字段成员用于描述状态,方法成员用于描述操作。

1.字段

类的成员变量又称为字段成员,字段成员也称成员变量,格式如下。

访问修饰符数据类型字段名=初值;

1)如果不希望其他类访问该成员,则在定义该类的成员时,“访问修饰符”使用protected或private;如果希望其他类访问该成员,则在定义该类的成员时,用public访问修饰符。例如:

publicstringname;//姓名

2)“字段名”使用camel命名规范来命名,使用名词定义字段名称。

3)“初值”表示该字段的初始状态,例如:

publicintage=18;//年龄,整型,初值18岁

2.方法成员

在类的定义中,类的方法成员在C#中称为方法,在其他程序语言中称为函数。格式如下。

978-7-111-60561-4-Chapter01-13.jpg

1)这里介绍的方法成员,其“访问修饰符”不能是私有的private或受保护的protected,要声明为public,才能在其他类中访问到。

2)“返回值类型”可以是string、int等基本数据类型,也可以是类类型。如果该方法不返回值,则使用void关键字。

采用以下形式声明一个无参数的、不返回值的方法:

978-7-111-60561-4-Chapter01-14.jpg

方法执行完毕后可以不返回任何值,也可以返回一个值。如果方法有返回值,那么方法体中必须要有return语句,且return语句必须指定一个与方法声明中的返回类型一致的表达式;如果方法不返回任何值,则返回类型为void。方法体内可以有return语句,也可以没有return语句,return语句的作用是立即退出方法的执行。

3)“方法名”使用Pascal命名规范,应使用动词或动词短语。在一个类中,访问修饰符或功能相同的方法应该放在一起。

4)“形参列表”是包括类型名和名称的列表,类型可以是简单数据类型,也可以是类类型。形参列表可以没有,也可以多个。即使不带参数也要在方法名后加一对圆括号。形参列表的形式如下。

类型1形参1,类型2形参2,…

方法成员中的“形参列表”是形式参数表(简称形参parameter),是在定义方法的时候使用的参数,目的是用来接收调用该方法时传入的参数。形参的本质是一个名字,不占用内存空间。

5)“方法体”就是方法中的0个或多个语句。

【例1-3】对【例1-1】中分析的类,可以定义类的代码如下。

978-7-111-60561-4-Chapter01-15.jpg

978-7-111-60561-4-Chapter01-16.jpg

978-7-111-60561-4-Chapter01-17.jpg

978-7-111-60561-4-Chapter01-18.jpg

在Visual Studio中,按下面方法创建类。

1)运行Visual Studio,打开“文件”菜单,依次单击“新建”→“项目”,如图1-8所示。

2)显示“新建项目”对话框,在左侧栏中选中“Visual C#”,在中部单击“控制台应用程序”,在“位置”中输入保存项目的路径,在“名称”中输入项目名,如图1-9所示,单击“确定”按钮。对于初学者,控制台程序是学习基础知识的最好工具。

978-7-111-60561-4-Chapter01-19.jpg

图1-8 新建项目菜单

978-7-111-60561-4-Chapter01-20.jpg

图1-9 “新建项目”对话框

3)显示代码视图窗口,在“解决方法资源管理器”窗格中,右击项目名,显示快捷菜单,单击“添加”→“类”,如图1-10所示。

4)显示“添加新项”对话框,如图1-11所示,在对话框中部选定“类”,此时“名称”框中默认类文件的名称为Class1.cs,建议更改为与类名相同,这里更改为Student.cs,然后单击“添加”按钮。

978-7-111-60561-4-Chapter01-21.jpg

图1-10 项目名的快捷菜单

978-7-111-60561-4-Chapter01-22.jpg

图1-11 “添加新项”对话框

5)显示“Student.cs”代码窗格,如图1-12所示。在“Student.cs”代码窗格中输入定义Student类的代码,如图1-13所示。

978-7-111-60561-4-Chapter01-23.jpg

图1-12 “Student.cs”代码窗格

978-7-111-60561-4-Chapter01-24.jpg

图1-13 在“Student.cs”窗格中输入定义类的代码

也可以不用前面的方法添加类,而是在“Program.cs”窗格的namespace{}中输入定义类的代码,如图1-14所示。对于只有几个类的简单程序,采用这种方法更直观方便。

978-7-111-60561-4-Chapter01-25.jpg

图1-14 在“Program.cs”窗格输入定义类的代码

【课堂练习1-3】对【课堂练习1-2】中分析的类,请写出定义类的代码。

【例1-4】对【例1-2】中分析的类,可以定义类的代码如下。

978-7-111-60561-4-Chapter01-26.jpg

978-7-111-60561-4-Chapter01-27.jpg

978-7-111-60561-4-Chapter01-28.jpg

978-7-111-60561-4-Chapter01-29.jpg

1.2.3 成员变量

成员变量是在类中定义的变量,字段、属性都能够叫作成员变量。定义在方法中的变量称为局部变量。

1.成员变量与this关键字

如果局部变量的名字与成员变量的名字相同,要想在该方法中使用成员变量,必须使用this关键字。在C#中,this关键字有多种用法,这里介绍在类定义中的用法,this用于区分成员变量和局部(本地)变量(或参数)。this关键字就是表示类中定义的成员名。

【例1-5】定义一个名为Person的类,类中包括字段:name(姓名)、gender(性别)、age(性别),包括方法:Study()、Work()。代码如下。

978-7-111-60561-4-Chapter01-30.jpg

上面Study()、Work()方法中的this.name表示成员名,name、age表示形式参数或局部(本地)变量。在方法中,通过this可以在语义上区分成员名、参数名(或局部变量)。

注意:在实际编程中是不建议参数名与字段名相同的,这样做降低了代码的易读性,这里只是为了说明this关键字的用法而已。

2.成员变量与局部变量的区别

(1)成员变量

1)成员变量定义在类中,在整个类中都可以被访问。

2)成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象所在的堆内存中。

3)成员变量有默认初始化值。

(2)局部变量

1)局部变量只定义在局部范围内,如方法(函数)内、语句内等,只在所属的区域有效。

2)局部变量存在于栈内存中,作用范围结束后,变量空间会自动释放。

3)局部变量没有默认初始化值。

在使用变量时需要遵循的原则:就近原则。首先在局部范围找,有就使用;接着在成员位置找。

(3)成员变量与局部变量的区别

1)在类中的位置不同。

成员变量:在类中方法外面。

局部变量:在方法或者代码块中,或者方法的声明上(即在参数列表中)。

2)在内存中的位置不同。

成员变量:在堆中(方法区中的静态区)。

局部变量:在栈中。

3)生命周期不同。

成员变量:随着对象的创建而存在,随着对象的消失而消失。

局部变量:随着方法的调用或者代码块的执行而存在,随着方法的调用完毕或者代码块的执行完毕而消失。

4)初始值不同。

成员变量:有默认初始值。

局部变量:没有默认初始值,使用之前需要赋值,否则编译器会报错(The local variable xxx may not have been initialized)。

1.3 创建对象

类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量;创建对象的过程也叫类的实例化。每个对象都是类的一个具体实例(Instance),拥有类的成员变量和成员方法。

1.3.1 对象的声明与实例化

对于已经定义的类,就可以用它作为数据类型来创建类的对象,简称对象。创建类的对象分为以下两个步骤。

1.声明对象引用变量

声明对象也称声明类变量,其语法格式如下。

类名 对象名;

1)“类名”是已经定义的类名称。

2)“对象名”使用camel命名规范来命名,使用名词命名对象名称。

例如,声明一个Student类型的对象stu,代码如下。

Student stu;//声明Student类的类型的对象stu,但未实例化

上面代码,只声明了Student类型的变量,并没有对类中的成员赋值,即未实例化,类成员没有实例化将不能访问。

2.创建类的实例

创建类的实例也称实例化一个类的对象,简称创建对象。可以对已声明的对象进行实例化(也称初始化),实例化对象需要使用运算符new。其语法格式如下。

对象名=new类名(参数列表);

“参数列表”是可选的,根据类的构造函数来确定。“参数列表”将在构造函数中介绍。

例如,下面代码创建Student类的实例,并赋给stu对象,对stu对象进行初始化。

stu=new Student();//创建Student类的实例,并把引用地址赋给stu

通常是把上面声明对象与实例化对象的两个语句合在一起,其语法格式如下。

类名 对象名=new类名(参数列表);

例如,把上面两行代码写在一起,代码如下。

Student stu=new Student();//声明Student类型的对象stu,并初始化stu对象

使用类声明的对象,实质上是一个引用类型变量,使用运算符new和构造函数来实例化对象并获取内存空间。

注意:有关类的实例(对象)的声明与创建不能放在该类的内部,只能在外部(即其他类中),通常写在class Program类的Main()方法中。

1.3.2 对象成员的访问

类或对象成员的访问,可分为在本类内使用该成员、实例成员的访问和实例方法的访问3种方式。

1.在本类内使用成员

如果在本类内使用成员,类名可以省略,用this表示本类内的成员。格式如下。

this.成员

2.实例成员的访问

如果在其他类中访问实例成员,格式如下。

对象名.成员名

说明:“.”是一个运算符,其功能是访问指定类型或命名空间的成员。

例如,下面代码为对象的成员赋值:

stu.gender="女";//为stu对象的gender成员赋值

3.实例方法的访问

实例方法的使用格式如下。

对象名.方法名(实参列表);

在调用方法时,实际参数(简称实参argument)将赋值给形参。因而,必须注意实参的个数、类型,应与形参一一对应,并且必须要有确定的值。实参的本质是一个变量,并且占用内存空间。只有在程序执行过程中调用了方法,形参才有可能得到具体的值,并参与运算求得方法值。实参列表的形式如下。

实参1,实参2,…

使用带有返回值的方法使用时,调用实例方法的格式一般采用:

变量名=对象名.方法名(实参1,实参2,…);

如果不需要使用方法的返回值,则采用如下调用格式:

对象名.方法名(实参1,实参2,…);

例如,下面代码:

stu.Study("英语");//访问stu对象的study()方法,实参是“英语”

1.3.3 类和对象应用示例

【例1-6】在【例1-3】定义类的基础上,在Program类的Main()方法中编写如下代码。

978-7-111-60561-4-Chapter01-31.jpg

978-7-111-60561-4-Chapter01-32.jpg

在如图1-15所示的窗口中,单击“Program.cs”标签,或者在“解决方案资源管理器”窗格中双击“Program.cs”,显示“Program.cs”代码窗口。在“static void Main(string[]args)”下的“{}”中输入主程序代码,如图1-16所示。

978-7-111-60561-4-Chapter01-33.jpg

图1-15 “Program.cs”代码窗口

978-7-111-60561-4-Chapter01-34.jpg

图1-16 输入主程序代码

为了查看程序的运行结果,单击“调试”菜单中的“开始执行(不调试)”命令,如图1-17所示。

显示程序运行结果,如图1-18所示。查看运行结果后,关闭运行窗口,因为只有关闭运行窗口后,才能在代码窗口中编辑。

978-7-111-60561-4-Chapter01-35.jpg

图1-17 “调试”菜单

978-7-111-60561-4-Chapter01-36.jpg

图1-18 运行结果

【课堂练习1-4】请在【课堂练习1-3】定义类的基础上编写代码,在主程序中编写创建对象,给字段赋值,调用方法的代码。

【例1-7】在【例1-4】定义类的基础上,在Program类的Main()方法中编写如下代码。

978-7-111-60561-4-Chapter01-37.jpg

978-7-111-60561-4-Chapter01-38.jpg

1.4 命名空间

命名空间有两个作用,一是便于管理,二是避免命名冲突。

1.4.1 命名空间概述

978-7-111-60561-4-Chapter01-39.jpg

在现实生活中,例如家庭物品,往往是按物品的类别、使用频率等分别存放,图书放在书架上,衣服放在衣柜中,鞋子放在鞋架上,厨具放在厨房中,这是为了便于管理。

对于重名问题,假设你的两位同学都叫“王芳”,在你的手机电话簿或微信中,怎样命名呢?可能会根据年龄大小,在她们的名字前加上前缀,例如“大王芳”“小王芳”;或者采用她们的网名或网名前缀,例如“真水无香王芳”“王芳细雨”等。这是为了避免命名冲突。

namespace即“命名空间”,也称“名称空间”“名字空间”。命名空间是用来组织和重用代码的,与名字含义相同,由于不同的人写的程序不可能所有的变量都没有重名现象。对于系统库来说,这个问题尤其严重,如果两个人写的库文件中出现同名的变量或函数(不可避免),就有问题了。为了解决这个问题,引入了命名空间这个概念。

命名空间的作用是为了解决下面两个问题:

1)为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短的名称),提高源代码的可读性。

2)编写的代码与C#内部的类、函数、常量或第三方类、函数、常量之间的名字冲突。

namespace机制提供一种资源隔离方案,系统资源不再是全局性的,而是属于特定的namespace,互不干扰。通常来说,命名空间是唯一识别的一套名字,这样当对象来自不同的地方但是名字相同的时候就不会含糊不清了。命名空间主要是为了解决名字(自定义的类型名、变量名、方法名)冲突的问题,是避免类名冲突的一种方式。

1.4.2 命名空间的声明

命名空间是.NET Framework开发的基础,是所有标识符(例如类)的命名容器。C#中的类是利用命名空间组织起来的。命名空间提供了一种从逻辑上组织类的方式,防止命名冲突。程序员除了可使用.NET Framework自带的各种命名空间外,还可以自定义命名空间。

用namespace关键字声明一个命名空间,此命名空间范围允许程序员组织代码,并允许创建类、属性和方法。声明(定义、创建)命名空间的语法格式如下。

978-7-111-60561-4-Chapter01-40.jpg

在命名空间中,可以声明类、接口、结构、枚举、委托命名空间。

定义命名空间时需要遵循以下规则。

1)“命名空间名”可以是任何合法的标识符,与变量的命名规则相同。

2)无论是何种情况,一个命名空间的名称在它所属的命名空间内必须是唯一的。命名空间隐式地为public,而且在命名空间的声明中不能包含任何访问修饰符。

3)如果未自定义声明命名空间,则会创建默认命名空间(有时称为全局命名空间)。全局命名空间中的任何标识符都可用于命名的命名空间中。

4)命名空间声明出现在另一个命名空间声明内时,该内部命名空间就成为包含着它的外部命名空间的一个成员。这种情况称为命名空间的嵌套。

【例1-8】在同一个项目中,如果出现名称相同的两个类,可以放在不同的命名空间中。如图1-19所示,在Class1.cs文件中,声明命名空间MyShool,在该命名空间中定义了Student类。如图1-20所示,在Class2.cs文件中,声明命名空间YourShool,该命名空间中也定义了Student类。两个命名空间中的Student类互相不受影响。

978-7-111-60561-4-Chapter01-41.jpg

978-7-111-60561-4-Chapter01-42.jpg

图1-19 命名空间MyShool中的Student类

978-7-111-60561-4-Chapter01-43.jpg

图1-20 命名空间YourShool中的Student类

978-7-111-60561-4-Chapter01-44.jpg

图1-21 在Program类中引用命名空间和类

若Program类中用到Student类,怎么办?有两种方法,一是直接用命名空间名作为类的前缀,例如:

YourShool.Student stu=new YourShool.Student();

二是引用命名空间,例如:

using MySchool;

如图1-21所示。

从本质上讲,命名空间就是一个容器,在这个容器内可以放入类、方法、变量等,它们在同一个命名空间内可以无条件相互访问。在命名空间之外,就必须引用或者导入其他命名空间,才能调用它们包含的这些项。

1.4.3 导入其他命名空间

在当前类中,如果要使用其他命名空间中定义的类,要用using导入。using作为导入命名空间指令,有以下两种使用方式。

1.导入命名空间

using指令导入其他命名空间中定义的类型成员,指令格式如下。

using命名空间名;

“命名空间名”可以是系统命名空间、自定义命名空间。这样可以将一个命名空间中所包含的类型导入到命名空间体中,从而可以直接使用这些导入类型的标识符,而不必指定类型的详细命名空间名。

例如,导入最常用的系统命名空间:

using System.Text;

例如,导入自定义命名空间:

using MyShool;

2.创建别名并导入命名空间

using指令用于为一个命名空间或类型指定一个别名,并导入命名空间。指令格式如下。

using别名=命名空间名 或 类型名称;

用别名的方法将会更简洁,用到哪个类就给哪个类做别名声明即可。

using Shool=MyShool;

别名一般用于嵌套命名空间,因为在嵌套时,其名称较长。如果有多个命名空间需要使用别名,就用多个using来定义别名。using别名指令中的别名,在包含该using别名指令的声明空间内必须是唯一的。

1.4.4 命名空间的嵌套

1.声明嵌套的命名空间

嵌套的命名空间,其形式如下。

978-7-111-60561-4-Chapter01-45.jpg

对于嵌套的命名空间,在命名空间的声明中各命名空间用“.”分隔。例如,前面的代码在语义上等效于:

978-7-111-60561-4-Chapter01-46.jpg

2.导入嵌套的命名空间

导入嵌套的命名空间时,使用:

using City.MyShool.MyGrade;

或者使用别名:

using user=City.MyShool.MyGrade;

在创建对象时,用别名可写为:

user.Student stu=new user.Student();

1.5 习题

一、选择题

978-7-111-60561-4-Chapter01-47.jpg

1.在类的定义中,类的( )描述了该类的对象的行为特征。

A.类名 B.方法 C.属性 D.所属的命名空间

2.在C#类的定义中,this关键字就是表示类中定义的( )。

A.成员名 B.方法名 C.局部变量名 D.命名空间名

3.在C#中,以下关于命名空间的叙述正确的是( )。

A.命名空间不可以嵌套

B.在任意一个.cs文件中只能存在一个命名空间

C.使用private修饰的命名空间,其内部的类不允许访问

D.命名空间使得代码更加有条理,结构更清晰

二、编程题

1.设计控制台应用程序,程序包含如下内容:

1)定义狗类Dog。

字段:名字(name)、年龄(age)、性别(sex)、皮毛颜色(furColor)。

方法:叫的方法(Bark()),显示“汪汪汪”。

跑的方法(Run()),显示“撒欢地跑”。

2)定义猫类Cat。

字段:名字(name)、年龄(age)、性别(sex)、皮毛颜色(furColor)、猫眼睛的颜色(eyeColor)。

方法:叫的方法(Bark()):显示“喵喵喵”。

3)主类:实现一个Dog对象(miaomiao毛毛,3,母,金色),实现叫的方法和跑的方法。

实现一个Cat对象(mimi咪咪,2,公,白色,蓝色),实现叫的方法。

2.设计控制台应用程序,定义球Ball类,已知球的半径,计算球的体积、表面积。

字段:球的半径(radius)。

方法:计算球体积的方法BallVolume(),计算公式978-7-111-60561-4-Chapter01-48.jpg

计算球表面积的方法BallSurfaceArea(),计算公式S=4πR2