2024年2月20日发(作者:)

.

面向对象程序设计习题库

选择题

1. 一个设计得好的面向对象系统具有( D)特征。

A 低内聚、低耦合 B 高内聚、低耦合 C 高内聚、高耦合 D 低内聚、高耦合

2. 面向对象程序设计的特点主要概括为(C)。

A 可分解性、可组合性、可分类性 B 继承性、封装性、多态性

C 抽象封装性、继承性、多态性 D 封装性、易维护性、可扩展性、可重用性

3. 关于C#程序的书写,下列不正确的说法是( D )。

A. 区分大小写 B. 一行可以写多条语句

C. 一条语句可写成多行

D. 一个类中只能有一个Main()方法,因此多个类中可以有多个Main()方法

4. 关于C#语言的基本语法,下列哪些说法正确的是( C )

A. C#语言使用using 来引用需要用到的命名空间;

B. 用C#编写的程序中,Main 函数是唯一允许的全局函数;

C. C#语言中使用的名称严格区分大小写;

D. C#中一条语句必须写在一行内;

5 以下标识符中,正确的是(A )。

A. _nName B. typeof C. 6b D. x5#

6.字符串连接运算符包括&和( A )。

A. + B. - C. * D. /

7.拆箱是关于:( B )

A、值类型到引用类型的转换 B、引用类型到值类型的转换

C、引用类型到引用类型的转换 D、值类型到值类型的转换

8.装箱是关于:( A )

A、值类型到引用类型的转换 B、引用类型到值类型的转换

C、引用类型到引用类型的转换 D、值类型到值类型的转换

9.下列引用类型和值类型描述正确的是( A )。

A. 引用类型变量保存内存地址,值类型直接保存变量值

B. 引用类型在变量中直接保存变量值,值类型保存内存地址

C. 引用类型和值类型保存数据的方式相同

D. .NET Framework不支持值类型,因为所有的类型都是引用类型了

10.一个类中的静态方法的调用可以:( A )

A、通过类名调用 B、通过实例化的对象调用

C、在主方法中直接调用 D、在同一个类中的某一方法中直接调用

.

.

11.以下数据类型中,属于引用类型的是:(A )

A、string类型 B、double类型 C、int类型 D、 char类型

12.下列类型中为值类型的是( C )

A. 字符串类型 B. 树组类型 C. 枚举类型 D. 接口类型

l类型和浮点类型都可以表示小数,正确说法:( C )

A. 两者没有任何区别 B. 小数类型比浮点类型取值范围大

C.小数类型比浮点类型精度高 D. 小数类型比浮点类型精度低

14. 有定义语句:int [,]a=new int[5,6]; 则下列正确的数组元素的引用是__C__。

A. a(3,4) B. a(3)(4) C. a[3][4] D. a[3,4]

15. 在C#编制的财务程序中,需要创建一个存储流动资金金额的临时变量,则应使用下列哪条语句?( A )

A. decimal theMoney; B. int theMoney; C. string theMoney; D. double

theMoney;

16. 在C#中,表示一个字符串的变量应使用以下哪条语句定义?( B )

A. CString str; B. string str; C. Dim str as string D. char * str;

17. C#中每个int 类型的变量占用( C )个字节的内存。

A. 1 B. 2 C. 4 D. 8

18.假定一个10行20列的二维整型数组,下列哪个定义语句是正确的( C )。

A. int[ ] arr = new int[10,20] B. int[ ] arr = int new[10,20]

C. int[ , ] arr = new int[10,20] D. int[ , ] arr = new int[20;10]

19. 枚举型常量的值不可以是( D )类型

A. int B. long C. ushort D. doule

20.引用类型主要有4种:类类型、数组类型、接口类型和( C )。

A.对象类型 B.字符串类型 C.委托类型 D.整数类型

21. 分析下列语句:

namespace TestCS

{

public delegate void Hello(string target);

}

该语句的作用是:( D )

A. 在TestCS 命名空间中定义了一个名为Hello 的全局方法;

B. 在TestCS 命名空间中声明了函数Hello 的原型;

C. 在TestCS 命名空间中定义了一个名为Hello 的函数指针;

D. 在TestCS 命名空间中定义了了一个名为Hello 的委托类型;

22. 以下关于for循环的说法不正确的是 ( A )。

A. for循环只能用于循环次数已经确定的情况

B. for循环是先判定表达式,后执行循环体语句

C. for循环中,可以用break语句跳出循环体

D. for循环体语句中,可以包含多条语句,但要用花括号括起来。

23.下面对异常说法不正确的是( D )

A.try/catch块为基本引发异常的组合

B.在捕获异常时,可以有多个catch块

C.无论异常是否发生,finally块总会执行

.

.

D.try块和finally 不能连用

24. C#程序中,可使用atch 机制来处理程序出现的( B )错误。

A. 语法 B. 运行 C. 逻辑 D. 拼写

25. 为了能够在程序中捕获所有的异常,在catch语句的括号中使用的类名为( A )_。

A. Exception B. DivideByZeroException C. FormatException D. 以上三个均可

26. C#源程序文件的默认扩展名为( C )。

A. cpp B. exe C. cs D. lik

27. 下列的( D )不是构造函数的特征。

A. 构造函数的函数名和类名相同

B. 构造函数可以重载

C. 构造函数可以带有参数

D. 可以指定构造函数的返回值

28.类的析构函数的作用是( D )

A.一般成员函数 B.类的初始化

C.对象的初始化 D.释放资源

29.类的析构函数是在( C )调用的。

A.类创建时 B.创建对象时

C.销毁对象时 D.不自动调用

30. 在C#程序中,可以使用( A )属性来引用处于非托管代码环境中的函数。

A. [DllImport] B. [Conditional] C. [STAThread] D. [SecureMethod]

31.对托管代码与非托管代码之间的区别描述正确的是( D )。

A. 非托管代码依赖于CLR提供的服务,而托管代码不需要

B. 托管代码生成的应用程序为目标机器上可执行文件,非托管代码生成的应用程序为中间语言文件

C. 托管代码和非托管代码之间没有区别

D.托管代码依赖于CLR提供的服务,而非托管代码不需要

32.在命名空间中( C )类是实现创建、移动、枚举目录和子目录的实例方法。

A.Diretory B.File C.DirectoryInfo D.FileInfo

33.下面对程序集和命名空间说法正确的是( B )。

A. 一个程序集只能引用一个命名空间

B. 一个程序集可以引用多个命名空间,一个命名空间也可以保存在多个程序集中

C. 一个程序集可以引用多个命名空间,但一个命名空间只能保存在一个程序集中

D. 一个命名空间可以保存在多个程序集中,命名空间无法包含另外的命名空间

34.( C )命名空间中的类和接口用于创建Web 应用程序的页面?

A. g B.

.

.

C. D. e

35. 使用( B )命名空间的类访问SQL Server 数据库中的数据。

A. B. ent

C. ization D.

36.构成对象的两个主要因素是( A )。

A 属性和操作 B 标识和内容 C 继承和多态 D 消息和封装

37.下面的修饰符中( C )不是访问修饰符。

A.public B.protected C.new D.internal

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

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

39.有关类和对象的说法不正确的是(B)。

A)对象是类的实例 B)一个类只有一个对象

C)任何一个对象只能属于一个类 D)类与对象的关系和数据与变量的关系相似

E)类是抽象的,对象是具体的

40. 以下类MyClass 的属性count 属于( B )属性.

class MyClass

{

int i;

int count

{

get{ return i; }

}

}

A. 只写 B. 只读 C. 可读写 D. 不可读不可写

41. 根据下面的代码,可以确定类A与类B之间存在( A )关系。

public class A {

private B theB;

public void aMethod(){ hing(); }

}

A 关联 B 泛化 C 实现 D 包含

42.继承机制的作用是( D )

A.信息隐藏 B.数据封装

C.定义新类 D.数据抽象

43 已知类B是由类A继承而来,类A中有一个为M的非虚方法,现在希望在类B中也定义一个名为M的方法,若希望编译时不出现警告信息,则在类B中声明该方法时,应使用( B )方法。

A. static B. new C. override D. virtual

.

.

44.类的以下特性中,可以用于方便地重用已有的代码和数据的是( C ).

A.多态 B.封装 C.继承 D.抽象

45. 在 中,执行数据库的某个操作,则至少需要创建( A )并设置它们的属性,调用合适的方法:

A. 一个Connection 对象和一个Command 对象

B. 一个Connection 对象和DataSet 对象

C. 一个Command 对象和一个DataSet 对象

D. 一个Command 对象和一个DataAdapter 对象

46.下列说法中对 Mdi子窗体描述正确的是( D )

A.设置MdiChildForm属性为true

B.设置MdiChild属性为false

C.设置MdiChild属性为true

D.设置MDI子窗体MDiParent属性引用父窗体实例

47. 使用派生类的主要原因是( A ) 。

A 提高代码的可重用性 B提高程序的运行效率

C 加强类的封装性 D 实现数据的隐蔽

48、如果一个类至少有一个抽象方法,那么就称该类为( A )。

A抽象类 B接口类 C密封类 D所有类

49、在C#语言中引入泛型,是为了提高 ( D )。

A程序运行效率 B程序通用性

C类的安全性 D以上三个方面

50.以下( D ) 对接口方法的陈述是正确的

A可以是静态的 B可以是公有的

C可以是任何访问限制 D以上都不对

填空题

1、常用的面向对象的程序语言有:C++、 、

等。

参考答案:java c#

2.定义方法时使用的参数是 ,调用方法时使用的参数是 。

参考答案:形参 实参

3.数据类型说明符用来说明方法返回值的类型,如果没有返回值,则其类型说明符应为 。

.

.

参考答案:void

4、在C#中,进行注释有两种方法:使用 // 和使用/* */符号对,其中 只能进行单行注释。

参考答案://

5、使用泛型类型可以最大限度地重用代码、 以及 。

参考答案:保护类型的安全 提高性能

6、

C#数组元素的下标从 开始。

参考答案:0

7.设x为int型变量,请写出描述“x是奇数”的C#语言表达式 。

参考答案: x%2==1

8.已知字符串str的值为“abcdefgh”,则表达式ing(1,3)的值为 。

参考答案:bcd

9. 当在程序中执行到 语句时,将结束本层循环类语句或switch语句的执行。

参考答案:break

10. 当在程序中执行到________语句时,将结束所在循环语句中循环体的一次执行。

参考答案:continue

11. 在switch语句中,在分支的最后应有一个 选项。

参考答案:default

12. 在C#语言中,实现从群集中取出每一个元素的循环语句是 。

参考答案:foreach

一个命名空间除了可包含其他命名空间外,还可包含 、 、 、枚举、委托等成员。

参考答案:类 结构 接口

Framework 包括三个主要部分: 、 和 。

参考答案:公共语言运行库 类库 应用模板

14、在.NET中所有类的基类是 。

参考答案:Object

15、抽象模型越简单,它就 ,也就越具有普遍性。抽象模型越复杂,就越 。

参考答案:越抽象 具体

16、在学习新东西时,大脑会自动搜寻以前创建和掌握的抽象/模型,以资借鉴。这种进行特性对比,找到可供重用的近似抽象的过程又称为

和 。

.

.

参考答案:模式匹配 模式重用

17、委托是一种数据类型,它的作用是 。

参考答案:允许在运行时选择要调用哪些函数。

18.传入某个属性(访问器结构)的SET方法的隐含参数的名称是 。

参考答案:value

19、在面向对象的结对关系有三种,分别是:

和 、 。

参考答案要点:一对一 一对多 多对多

20、在.NET中表示接口的关键字是 。

参考答案:interface

21、接口可由 、 、事件、索引器或这四种成员类型的任意组合构成。接口不能包含 。

参考答案:方法 属性 字段

22、在类中若要实现接口成员,类中的对应成员必须是 、 ,并且与接口成员具有相同的名称和签名。

参考答案:公共的 非静态的

23、在中的对象有 、 和DataSet等。

参考答案:SqlConnection SqlCommand

24、常用的SQL操作语句有 、 、 和

Delete 等。

参考答案:Select 、 Update 、Insert

.

.

25.Timer控件的 属性用来设置定时器Tick事件发生的时间间隔。

参考答案:Interval

26、用以说明类中私有成员的关键字是 。

参考答案:(private)

27、对类的实例数据成员的访问格式为对象名 。

参考答案:(.数据成员名)

28、类有两种用法,一种是用于 ,另一种是通过 派生新的类。

参考答案:(定义对象,继承或派生)

29 静态成员在类中有两种情况,即 和 。

参考答案:(静态成员函数,静态数据成员。可以颠倒)

30. 根据类的赋值兼容原则,派生类对象可以赋给 的变量。

参考答案:(基类)

31 异常处理,就是针对软件的外部环境出现意外和 所作出的适当处理。

参考答案:(错误)

32. 静态构造函数是通过 来调用的。

参考答案:(类)

简答题

.

.

1. 简述面向对象程序设计的三要素。

参考答案要点:在上述面向对象的基本概念基础之上,不可避免地要涉及到面向对象程序设计所具有的3个共同特征:用户定义类型、继承和多态性。用户定义类型提供一种表达真实世界的直观代码,便于重用,减少代码量。继承:不修改代码的条件下进行扩展,派生类较为短小,编写(维护)更少;多态如何使同一个消息被不同类型的对象响应。

2. 简述面向对象程序设计的抽象和封装。

参考答案要点:抽象是人们认识事物的常用方法,比如地图的绘制。抽象的过程就是如何简化、概括所观察到的现实世界,并为人们所用的过程。抽象包括对象的状态与行为,对应到类的属性与方法。抽象出来的属性通过封装可以减少数据冗余,进行信息隐藏和保护数据完整性。

3. 类与对象有什么关系?

参考答案要点:类是一种用户自定义的数据类型.对象是使用自定义的类名在程序中说明变量.或者说;具有类类型的变量即为对象.类是创建对象的样板;对象是类的实例。

4. 判断下列类之间的关系,把它们分别列入A聚合 B 继承 C 关联 D 都不是这四类中。

1.大学 – 学院 2.学生 – 课程 3.学生 – 大一新生

4.汽车 – 车门 5.货车 – 交通工具 6.公共汽车 – 车站

7.工具条 – 按钮 8.汽车发动机 – 汽车

9.员工 – 公司 10.本科生 – 研究生

参考答案:

聚合:1 4 7 8

继承:5 10

关联:2 6 9

都不是:3

5. 面向对象软件开发方法的目标

参考答案要点:封装性、易维护性、可扩展性、可重用性

6. 简述数据类型的“强类型“。

参考答案要点:为所有变量指定数据类型称为“强类型”。使用强类型有以下优点:

 它为变量启用智能提示(IntelliSense)支持。 这允许您在输入代码时看到变量的属性和其他成员。

 它会运用编译器类型检查。这将捕捉到因溢出等错误而在运行时失败的语句。这也可以在不支持方法的对象上捕捉对方法的调用。

.

.

 使代码的执行速度更快。

7.

简述C# 语言的优点

参考答案要点:

完全面向对象的设计。

强类型安全。

很好地融合了高级语言的简明性和 C++ 的强大功能。

垃圾回收。

类似于 C 和 C++ 的语法和关键字。

使用委托取代函数指针,从而增强了类型安全和安全性

8. 简述C#语言中的过程重载

参考答案要点:重载过程是指使用相同的名称和不同的参数列表在多个版本中定义某个过程。重载的目的是定义过程的若干个密切相关的版本,而不需要通过名称来区分它们,可通过改变参数列表达到此目的。重载版本必须在以下至少一个方面不同于所有其他重载版本:

参数的数量

参数的顺序

参数的数据类型

类型参数的数量(适用于泛型过程)

返回类型(仅适用于转换运算符)

9. 简述在C# 语言中关键字new的用途并举例。

参考答案要点:在 C# 中,new 关键字可用作运算符、修饰符或约束。

new 运算符 :用于创建对象和调用构造函数。

new 修饰符 :用于向基类成员隐藏继承成员。

new 约束 :用于在泛型声明中约束可能用作类型参数的参数的类型。

10.关键字this的意义和用法?

参考答案要点:this 关键字引用类的当前实例,还可用作扩展方法的第一个参数的修饰符。

this 的常用用途:

限定被相似的名称隐藏的成员

将对象作为参数传递到其他方法

声明索引器

由于静态成员函数存在于类一级,并且不是对象的一部分,因此没有 this 指针。 在静态方法中引用 this 是错误的。

.

.

11.关键字base的意义和用法?

参考答案要点:tbase 关键字用于从派生类中访问基类的成员:

调用基类上已被其他方法重写的方法。

指定创建派生类实例时应调用的基类构造函数。

基类访问只能在构造函数、实例方法或实例属性访问器中进行。从静态方法中使用 base 关键字是错误的。 所访问的基类是类声明中指定的基类。

12.简述C# 程序的通用结构

参考答案要点:C# 程序可由一个或多个文件组成。每个文件都可以包含零个或零个以上的命名空间。一个命名空间除了可包含其他命名空间外,还可包含类、结构、接口、枚举、委托等类型。在某一个类中必须而且只能有一个静态的Main方法作为程序的入口。下面是一个程序的框架结构,它包含所有这些元素种类。

// A skeleton of a C# program

using System;

namespace YourNamespace

{

class YourClass

{

}

struct YourStruct

{

}

interface IYourInterface

{

}

delegate int YourDelegate();

enum YourEnum

{

}

namespace YourNestedNamespace

{

struct YourStruct

{

}

}

class YourMainClass

{

.

.

static void Main(string[] args)

{

//Your program

}

}

}

13.简述c#中类的成员

参考答案要点:类和结构具有表示其数据和行为的成员。

成员

字段

说明

字段是被视为类的一部分的对象的实例,通常用于保存类数据。例如,日历类可能具有一个包含当前日期的字段。

属性 属性是类中可以像类中的字段一样访问的方法。属性可以为类字段提供保护,以避免字段在对象不知道的情况下被更改。

方法 方法定义类可以执行的操作。方法可以接受提供输入数据的参数,并且可以通过参数返回输出数据。方法还可以不使用参数而直接返回值。

事件 事件向其他对象提供有关发生的事情(如单击按钮或成功完成某个方法)的通知。事件是使用委托定义和触发的。有关更多信息,请参见事件和委托。

运算符 运算符是对操作数执行运算的术语或符号,如 +、*、< 等。可以重新定义运算符,以便可以对自定义数据类型执行运算。有关更多信息,请参见可重载运算符(C# 编程指南)。

索引器

构造函数

析构函数

使用索引器可以用类似于数组的方式为对象建立索引。

构造函数是在第一次创建对象时调用的方法。它们通常用于初始化对象的数据。

析构函数是当对象即将从内存中移除时由运行库执行引擎调用的方法。它们通常用来确保任何必须释放的资源都得到适当的处理。

嵌套类型 嵌套类型是在类或结构中声明的类型,通常用于描述仅由包含它们的类型所使用的对象。

14.简要叙述类的构造函数和析构函数。

参考答案要点:构造函数:构造函数是一种特殊的方法 主要用来在创建对象时初始化对象 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 特别的一个类可以有多个构造函数可根据其参数个数的不同或参数类型的不同来区分它们即构造函数的重载

析构函数:析构函数用于类的实例销毁时完成的操作。

.

不能在结构中定义析构函数。 只能对类使用析构函数。

一个类只能有一个析构函数。

无法继承或重载析构函数。

无法调用析构函数。 它们是被自动调用的。

.

析构函数既没有修饰符,也没有参数。

15.简述Windows窗体程序中如何使用事件?

参考答案要点:事件是可以通过代码响应或“处理”的操作。事件可由用户操作(如单击鼠标或按某个键)、程序代码或系统生成。要在应用程序中使用事件,您必须提供一个事件处理程序(事件处理方法或函数),该处理程序执行程序逻辑以响应事件并向事件源注册事件处理程序。我们将该过程叫做事件连结(事件绑定)。事件驱动的应用程序执行代码以响应事件。每个窗体和控件都公开一组预定义事件,您可根据这些事件进行编程。如果发生其中一个事件并且在相关联的事件处理程序中有代码,则调用该代码。对象引发的事件类型会发生变化,但对于大多数控件,很多类型是通用的。例如,大多数对象都会处理 Click 事件。如果用户单击窗体,就会执行窗体的 Click 事件处理程序内的代码。

16.简述System 命名空间

参考答案要点:System 命名空间是 .NET Framework 中基本类型的根命名空间。 此命名空间包括表示由所有应用程序使用的基本数据类型的类: Object(继承层次结构的根)、 Byte、

Char、 Array、 Int32、 String 等。System 命名空间还包含 100 多个类,范围从处理异常的类到处理核心运行时概念的类,如应用程序域和垃圾回收器。此外,System 命名空间还包含许多二级命名空间,是我们编写程序的基础。

17.简述List<

T>类,并与ArrayList进行比较。

参考答案要点:List< T>类是 ArrayList类的泛型等效类。 该类使用大小可按需动态增加的数组实现 IList< T> 泛型接口。 ArrayList是一种.NET Framework 提供得预定义集合类,用于数据存储和检索对象的专用容器类。这些类一般支持堆栈、队列、列表和哈希表等常用数据结构。在决定使用 List< T>类还是使用

ArrayList 类(两者具有类似的功能)时,使用泛型集合会稍微增加了些编码的复杂性,但好处是您可以创建一个比 ArrayList 更安全并且速度更快的列表。List< T>类在大多数情况下执行得更好并且是类型安全的。

18.简述C#语言中类的属性成员。

参考答案要点:属性是类的一种成员:它们提供灵活的机制来读取、设置或计算私有字段的值。可以像使用公共数据成员一样使用属性,但实际上它们是称作“访问器”的特殊方法对字段进行封装,有助于提高方法的安全性和灵活性。属性使类能够以一种公开的方法获取和设置值,同时隐藏实现或验证代码。不实现 set 方法的属性是只读的。对于不需要任何自定义访问器代码的简单属性,可考虑选择使用自动实现的属性。

19.简述关键字static。

参考答案要点:使用 static 修饰符声明属于类型本身而不是属于特定对象的静态成员。static 修饰符可用于类、字段、方法、属性、运算符、事件和构造函数,但不能用于索引器、析构函数或类以外的类型。

.

.

静态类和类成员用于创建无需创建类的实例就能够访问的数据和函数。静态类成员可用于分离独立于任何对象标识的数据和行为:无论对象发生什么更改,这些数据和函数都不会随之变化。当类中没有依赖对象标识的数据或行为时,就可以使用静态类。工具类一般都是静态类。

即使没有创建类的实例,也可以调用该类中的静态方法、字段、属性或事件。如果创建了该类的任何实例,不能使用实例来访问静态成员。只存在静态字段和事件的一个副本,静态方法和属性只能访问静态字段和静态事件。静态成员通常用于表示不会随对象状态而变化的数据或计算;例如,数学库可能包含用于计算正弦和余弦的静态方法。 静态方法可以被重载,但不能被重写。

20.简述C#语言中ref和out的作用及区别。

参考答案要点:ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数的任何更改都将反映在该变量中。out 关键字会导致参数通过引用来传递。这与

ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。尽管作为 out 参数传递的变量不必在传递之前进行初始化,但需要调用方法中实例化以便在方法返回之前赋值。

尽管 ref 和 out 在运行时的处理方式不同,但在编译时的处理方式相同。因此,如果一个方法采用 ref 参数,而另一个方法采用 out 参数,则无法重载这两个方法。例如,从编译的角度来看,以下代码中的两个方法是完全相同的。

21.简述.NET Framework,包括目的、组成及功能。

参考答案要点:.NET Framework的目的是便于开发商更容易地建立网络应用程序和Web服务,它的关键特色是提供了一个多语言组件开发和执行的环境。从层次结构来看,.NET Framework又包括三个主要组成部分:通用语言运行环境(Common Language Runtime)、类库、应用模板——主要包括面向Web的网络应用程序模板(Web Forms或Web Services)和Windows应用程序模板(Win Forms)。

其中通用语言运行环境在组件运行时,负责管理内存分配、启动和中止线程和进程、强化安全系数,同时还调整任何该组件涉及到的其他组件的附件配置。在通用语言运行环境上是类库框架,它为开发人员提供了一套能够被任何现代编程语言调用的、统一的面向对象、异步、层次结构的可扩展类库,包括集合、输入/输出、字符串、图画、网络、线程、全球化、安全加密、数据库访问、调试相关服务等类库。在服务框架之上是两种应用类型的模板,一类是传统的Windows应用程序模板,另一类是基于的Web网络应用程序模板。其中以一组控件和体系结构的方式提供了一个Web应用模型,由.NET框架提供的类库构建而成,通过它可以简化Web应用的实现过程。

22.简述C#中的垃圾回收技术

参考答案要点:.NET Framework 的垃圾回收器管理应用程序的内存分配和释放。每次您使用 new 运算符创建对象时,运行库都从托管堆为该对象分配内存。只要托管堆中有地址空间可用,运行库就会继续为新对象分配空间。但是,内存不是无限大的。最终,垃圾回收器必须执行回收以释放一些内存。对象在创建后,只有一个引用是指向对象的,随着代码的执行,垃圾回收器会跟踪对象的引用数量。每增加一个引用,计数器加1。当引用离开作用域以后,计数器就减少。当引用计数器达到0时,就将该对象和对象所占用的内存标记为回收。当垃圾回收器执行回.

.

收时,它检查托管堆中不再被应用程序使用的对象并执行必要的操作来回收它们占用的内存。

23.简述C#的类有五种不同的限制修饰符

参考答案:

public 可以被任意存取

protected只可以被本类和其继承子类存取

internal只可以被本程序集(Assembly)内所有的类存取,程序集是C#语言中类被组合后的物理单位,其编译后的文件扩展名往往是“.DLL”或“.EXE”。

 protected internal唯一的一种组合限制修饰符,它只可以被本组合体内所有的类或这些类的继承子类所存取。

 private只可以被本类所存取。

中常用的对象有哪些?分别描述一下。

参考答案要点:

Connection对象:用于连接数据库的对象,表示到数据源的一个唯一的连接。

Command对象:表示要对数据库执行的一个SQL语句或一个存储过程。

DataReader对象:数据库查询返回的数据对象,它与DataSet最大的不同是使用

DataReader 以只进、只读方式返回数据,从而提高应用程序的性能。

 DataSet对象:表示内存中数据的缓存,可以把它想像成一个临时的数据库,它里可以存多个表(DataTable)。

 DataAdapter对象:该对象是与DataSet配合使用的对象,用于把表填充到DataSet和更新DataSet等。

25.简要概述C#语言中的泛型

参考答案:

.

使用泛型类型可以最大限度地重用代码、保护类型的安全以及提高性能。

.

泛型最常见的用途是创建集合类。

.NET Framework 类库在 c 命名空间中包含几个新的预定义泛型集合类。尽可能地使用这些类来代替普通集合类,如 tions 命名空间中的 ArrayList。

 您可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。

 可以对泛型类进行约束以访问特定数据类型的方法。

 关于泛型数据类型中使用的类型的信息可在运行时通过使用反射获取。

四、计算题(每题8分,共24分)

1 . using System;

namespace P3_2

{ class Program

{ static void Main()

{ ComplexNumber c1 = new ComplexNumber(); c1.a =

1.5;

c1.b = 3;

ComplexNumber c2 = c1;

c2.a = c2.b;

("c1 = ");

();

("c2 = ");

();

ne();

} } class ComplexNumber

{ public double a;

public double b;

public void Write()

{ ine("{0}+{1}i", a, b);

} }}

运行结果:

2. using System;

namespace P5_2

{ class Program

{ static void Main()

{ Truck t1 = new Truck();

.

.

ine("卡车速度{0}公里/小时", );

ine("卡车行驶1000公里需{0}小时",

(1000));

Automobile a1 = t1;

ine("汽车速度{0}公里/小时", );

ine("汽车行驶1000公里需{0}小时",

(1000));

ne();

} }

public class Automobile

{ protected float speed;

public float Speed

{ get { return speed; }

set { speed = value; }

}

private float weight;

public float Weight

{ get { return weight; }

set { weight = value; }

}

public float Run(float distance)

{ return distance / speed;

} }

public class Truck : Automobile

{ private float load;

public float Load

{ get { return load; }

set { load = value; }

}

public new float Speed

{

get { return speed / (1 + load / Weight / 2); }

}

public Truck()

{ load = 30;

speed = 50;

Weight = 15;

}

public new float Run(float distance)

{ return (1 + load / Weight / 2) * (distance);

} }

}

.

.

运行结果:

3. mespace P10_2

{ class Program

{ static void Main()

{ BankAccount a1 = new BankAccount(1000, true);

IPayable p1 = a1;

ine("p1付款1100: " + ((1100) ? "成功" : "失败"));

ine("a1付款1100: " + ((1100) ? "成功" : "失败"));

a1 = new CreditCard(1000);

ine("a1付款1100: " + ((1100) ? "成功" : "失败"));

ne();

}

}

public interface IPayable

{ bool Pay(decimal money);

}

public class BankAccount : IPayable

{ private bool vip = false;

protected decimal balance = 0;

public BankAccount(decimal balance, bool vip)

{ e = balance;

= vip;

}

bool (decimal money)

{ if (balance >= money)

{ balance -= money;

return true;

}

else

return false;

}

public virtual bool Pay(decimal money)

{ IPayable p1 = (IPayable)this;

if(!vip)

return (money);

else

return (money * 0.9M);

.

.

} }

public class CreditCard : BankAccount

{ private decimal credit;

public CreditCard(decimal credit)

: base(0, true)

{ = credit;

}

public override bool Pay(decimal money)

{ if (money <= credit + balance)

{ balance -= money;

return true;

}

else

return false;

} }}

运行结果:

4. using System;

namespace P4_4

{

class Program

{

static void Main()

{

Student s1 = new Student("王小红");

Student s2 = new Student("周军");

s1 = new Student("Jerry");

ne();

}

}

public class Student

{

public static int objects = 0, classes = 0;

public string name;

public Student(string n)

{

name = n;

ine("对象计数: {0}", ++objects);

.

.

}

static Student()

{

ine("类计数: {0}", ++classes);

}

}

}

运行结果:

5. using System;

namespace P5_3

{ class Program

{ public static void Main()

{ Son s1 = new Son();

t();

} }

public class Grandsire

{ public Grandsire()

{ ine("调用Grandsire的构造函数");

}

~Grandsire()

{

ine("调用Grandsire的析构函数");

} }

public class Father : Grandsire

{ public Father()

{ ine("调用Father的构造函数");

}

~Father()

{ ine("调用Father的析构函数");

} }

public class Son : Father

public Son()

{ ine("调用Son的构造函数");

}

~Son()

{ ine("调用Son的析构函数");

} }}

.

.

运行结果:

6. using System;

namespace P10_4

{ class Program

{ static void Main()

{ Seaplane plane = new Seaplane();

IFlyable flyer = plane;

ine("{0}空中飞行1000公里需{1}小时", flyer,

(1000));

ISwimmable swimmer = plane;

ine("{0}水上航行1000公里需{1}小时", swimmer,

(1000));

Amphicar car = new Amphicar(80);

ine("{0}地面行驶1000公里需{1}小时", car,

(1000));

swimmer = car;

ine("{0}水上航行1000公里需{1}小时", swimmer,

(1000));

ne();

} }

public interface IFlyable

{ float Run(float distance);

}

public interface ISwimmable

{ float Run(float distance);

}

public class Seaplane : IFlyable, ISwimmable

{ float (float distance)

{ return distance / 50;

}

float (float distance)

{ return distance / 400;

} }

public class Automobile

{ private float speed;

public float Speed

{ get { return speed; }

}

public virtual float Run(float distance)

{ return distance / speed;

.

.

}

public Automobile(float speed)

{ = speed;

} }

public class Amphicar : Automobile, ISwimmable

{ public Amphicar(float speed)

: base(speed)

{ }

float (float distance)

{ return (distance) * 3;

} }

}

运行结果:

7. using System;

namespace P4_2

{ class Program

{ static void Main()

{ int a = 10, b = 20;

ValueSwap(a, b);

ine("值传递: a = {0}, b = {1}", a, b);

ReferenceSwap(ref a, ref b);

ine("引用传递: a = {0}, b = {1}", a, b);

ne();

}

public static void ValueSwap(int x, int y)

{ int z = x;

x = y;

y = z;

}

public static void ReferenceSwap(ref int x, ref int y)

{ int z = x;

x = y;

y = z;

} }}

运行结果:

.

.

8. using System;

namespace P11_3

{ class Program

{ static void Main()

{ Pair p1 = new Pair(0);

ue(5);

ine();

ine();

Pair p2 = new Pair("");

ue(5);

ue("王小红");

ine();

ine();

} }

public class Pair

{

public int Left;

public T Right;

public Pair(T right)

{ Right = right;

}

public void SetValue(int i)

{ Left = i;

}

public void SetValue(T t)

{ Right = t;

} }}

运行结果:

9. using System;

namespace P6_4

{ class Program

{ static void Main()

{ TrafficLight light = new TrafficLight();

Car car1 = new Car();

(light);

Ambulance amb1 = new Ambulance();

(light);

Color();

.

.

Color();

nt = true;

Color();

ne();

} }

public delegate void LightEvent(bool color);

public class TrafficLight

{ private bool color = false;

public bool Color

{ get { return color; }

}

public event LightEvent OnColorChange;

public void ChangeColor()

{ color = !color;

ine(color ? "红灯亮" : "绿灯亮");

if (OnColorChange != null)

OnColorChange(color);

} }

public class Car

{ private bool bRun = true;

public void Enter(TrafficLight light)

{ rChange += LightColorChange; }

public void Leave(TrafficLight light)

{ rChange -= LightColorChange; }

public virtual void LightColorChange(bool color)

{ if (bRun && color)

{ bRun = false;

ine("{0}停车", this);

}

else if (!bRun && !color)

{ bRun = true;

ine("{0}启动", this);

} } }

public class Ambulance : Car

{ private bool emergent = false;

public bool Emergent

{ get { return emergent; }

set { emergent = value; }

}

public override void LightColorChange(bool color)

{ if (emergent)

.

.

ine("{0}紧急行驶", this);

else

olorChange(color);

} }}

运行结果:

10. using System;

namespace P4_1

{ class Program

{ static void Main()

{ choolInfo();

Student s1 = new Student();

= "王小红";

Student s2 = new Student();

= "周军";

ment = "数学系";

= "华中科技大学";

choolInfo();

ersonalInfo();

ersonalInfo();

} }

public class Student

{ public static string School = "华中理工大学";

public string name, Department = "计算机系";

public int age;

public void WritePersonalInfo()

{ ine("{0} {1} {2} ", School, Department, name);

}

public static void WriteSchoolInfo()

{ ine(School);

} }}

运行结果:

11. namespace P6_3

{

public delegate int OneDelegate(int x);

class Program

{

.

.

static void Main()

{

int x = 0;

OneDelegate dg1 = new OneDelegate(Increment);

ine(dg1(x));

ine(x);

ine(dg1(x));

ine(x);

dg1 = delegate { return ++x; };

ine(dg1(x));

ine(x);

ine(dg1(x));

ine(x);

ne();

}

public static int Increment(int x)

{

return ++x;

} }}

运行结果:

12. using System;

namespace P11_4

{

class Program

{

static void Main()

{

GA g1 = new GA();

GA g2 = new GA();

GA g3 = new GA();

g1 = new GA();

g2 = new GA();

}

}

public class GA

{

T t = default(T);

static int objects = 0;

static int classes = 0;

.

.

public GA()

{

ine("GA<{0}>对象计数: {1}", typeof(T),

++objects);

}

static GA()

{

ine("GA<{0}>类计数: {1}", typeof(T),

++classes);

} }}

运行结果:

13. class OutReturnExample

{

static void Method(out int i, out string s1, string s2)

{

i = 66;

s1 = "def";

s2 = null;

}

static void Main()

{

int value=6;

string str1, str2=”value”;

Method(out value, out str1, str2);

ine(value);

ine(str1);

ine(str2);

}

}

运行结果:

14. using System;

namespace P5_5

{ class Program

.

.

{ static void Main()

{ Vehicle v1 = new Train();

();

ine("行驶1000公里需{0}小时", (1000));

v1 = new Truck(16, 24);

();

ine("行驶1000公里需{0}小时", (1000));

ne();

} }

public abstract class Vehicle

{ private float speed;

public float Speed

{ get { return speed; }

set { speed = value; }

}

public Vehicle(float speed)

{ = speed;

}

public virtual float Run(float distance)

{ return distance / speed;

}

public abstract void Speak();

}

public class Train : Vehicle

{ public Train()

: base(160)

{ }

public override void Speak()

{ ine("呜......");

} }

public abstract class Automobile : Vehicle

{ public Automobile(float speed)

: base(speed)

{ }

public override abstract void Speak();

}

public class Truck : Automobile

{ private float weight;

public float Weight

{ get { return weight; }

}

private float load;

public float Load

.

.

{ get { return load; }

}

public Truck(int weight, int load)

: base(50)

{ = weight;

= load;

}

public override float Run(float distance)

{return (1 + load / Weight / 2) * (distance);

}

public override void Speak()

{

ine("叭...叭...");

} }}

运行结果:

15. mespace P10_2

{ class Program

{ static void Main()

{ BankAccount a1 = new BankAccount(1000, true);

IPayable p1 = a1;

ine("p1付款1100: " + ((1100) ? "成功" : "失败"));

ine("a1付款1100: " + ((1100) ? "成功" : "失败"));

a1 = new CreditCard(1000);

ine("a1付款1100: " + ((1100) ? "成功" : "失败"));

ne();

}

}

public interface IPayable

{ bool Pay(decimal money);

}

public class BankAccount : IPayable

{ private bool vip = false;

protected decimal balance = 0;

public BankAccount(decimal balance, bool vip)

{ e = balance;

.

.

= vip;

}

bool (decimal money)

{ if (balance >= money)

{ balance -= money;

return true;

}

else

return false;

}

public virtual bool Pay(decimal money)

{ IPayable p1 = (IPayable)this;

if(!vip)

return (money);

else

return (money * 0.9M);

} }

public class CreditCard : BankAccount

{ private decimal credit;

public CreditCard(decimal credit)

: base(0, true)

{ = credit;

}

public override bool Pay(decimal money)

{ if (money <= credit + balance)

{ balance -= money;

return true;

}

else

return false;

} }}

运行结果:

五、程序设计题

1设计一个商品类,该类有三个字段:商品名称、商品编号、价格,其中,商品名称、商品编号设置为读写属性字段,价格设置为只读属性字段,具有为商品名称、商品编号、价格三个字段赋初值的构造函数。

2.已知10个成绩,试用排序思想,写出能计算去掉一个个最低成绩和一个最高成绩的平均成绩的方法。

3.已知一个整数N(N≥2),写出能判断它是否质数的方

.

.

.