net framework2.0程序设计课后习题答案

更新时间:2023-11-14 09:08:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第1章 Microsoft .NET Framework概要

习题答案

1. .NET Framework不支持哪种类型的用户界面?

a) Web窗体 b) Windows窗体 c) 公共语言运行库 d) 控制台应用程序

答:c

2. 下面哪个不是.NET Framework 类库的主要特点和提供的高级服务:

a) 跨语言继承和调试 b) 很容易学习和掌握 c) 是面向对象 d) 是安全且易于扩充

答:b

3. 垃圾收集器要求程序员

a) 为对象分配内存并在使用完毕后可不必释放它。 b) 为对象分配内存但在使用完毕后要释放它。 c) 不必为对象分配内存但在使用完毕后要释放它。 d) 不必为对象分配内存且在使用完毕后可不必释放它。

答:a

4. 列出.NET Framework的组件。

答:公共语言运行库(CLR)、.NET Framework类库、数据和XML、XML Web service、Web窗体和Windows窗体。

5. 公共语言运行库的用途是什么?

答:公共语言运行库(CLR)提供执行代码的环境、编译器、语言独立性和轻便

性、以及执行垃圾回收。

6. 公共语言规范的用途是什么?

答:公共语言规范(CLS)定义了一套所有与.NET兼容的语言应该支持的特性。

7. 什么是XML Web Service?

答:XML Web service是可编程的Web组件,它可以在Internet或者企业内部网的Web应用程序之间共享。

8. 什么是托管环境?

答:托管环境提供一些服务,如垃圾回收、安全性以及其他类似的特性。

9. 如何从某类的全名中识别它的命名空间名称和类型名称

答:因为.NET Framework类库中包含数百个类,所以将这些类分组到命名空间中。全名的第一部分(最右边点的前面部分)是命名空间名称。全名的最后一部

分(最右边点的后面部分)是类型名称。

10. .NET Framework类库(FCL)如何组织其众多的类型?

答:由于.NET Framework类库(FCL)包含了如此众多类型的定义,所以类库要以层次的命名空间结构来进行组织。

命名空间使用点句法命名方案将有关联的类逻辑分组,以便易于对其进行搜索和引用。

11. 解释什么叫托管代码。

答:以CLR为目标的代码称为托管代码,它由伪机器语言编写的指令组成,这种语言也称为通用中间语言(Common Intermediate Language,CIL)。CIL指令可在运行时实时(JIT)编译为本机代码(典型的x86代码)。

第2章 托管执行环境的介绍

习题答案

1. 元数据(metadata)类型不支持运行库做下面哪个功能?

a) 外部注册

b) 设定运行时上下文边界 c) 消解方法调用 d) 提供反射功能

答:a

2. 共语言运行库提供下面哪个工具来测试和调试MSIL?

a) MSIL编译程序

b) 只有MSIL反汇编程序

c) MSIL编译程序和MSIL反汇编程序 d) MSIL程序集和MSIL反汇编程序 答:d

3. 关于命名空间,下面正确的说法是哪个?

a) 命名空间不能嵌套另一个命名空间

b) 在不同命名空间中,类型可以具有相同的名字 c) 一个命名空间不能在多个文件中定义

d) 单独一个源代码文件不能定义多个命名空间 答:b

4. 在默认情况下,同一命名空间的成员具有的访问性是

a) public b) protect c) internal d) private 答:c

5. 下面哪一个命名空间声明的类与其他三个不同?

a). namespace MySchool.FirstNamespace {

class ClassA {} class ClassB {} }

b). namespace MySchool.FirstNamespace {

class ClassA {} }

namespace MySchool.FirstNamespace {

class ClassB {} }

c). namespace MySchool {

namespace FirstNamespace {

class ClassA {} }

class ClassB {}

}

d). namespace MySchool {

namespace FirstNamespace {

class ClassA {} class ClassB {} } }

答:c

6. .NET Framework中类型的根命名空间名称是什么?

答:System命名空间是.NET Framework中类型的根命名空间。

7. 应用程序可以使用什么类和方法来对控制台进行输入和输出?

答:在公共语言运行库中,你可以使用System命名空间中的Console类的Read、ReadLine、Write和WriteLine等方法,实现向控制台输入输出字符串或数值 。

8. 当编译引用程序集中类(除mscorlib.dll外)的代码时,你必须做什么?

答:必须使用/reference 编译开关选项。使用/reference编译选项后,编译器使指定库中的信息对当前正在编译的源程序可用。/r开关等效于/reference开关。

9. .NET编译器产生的代码叫什么?

答:Microsoft 中间语言(MSIL),有时也叫托管代码。

10. 哪一个.NET组件将MSIL编译成特定于CPU的本机代码?

答:实时(JIT)编译器。

11. .NET的哪个特性确保对象占用的内存被回收?

答:垃圾回收过程。

12. 公共语言运行库有什么优点?

答:所有托管代码都通过使用公共语言运行库运行,公共语言运行库提供了跨语言集成、自动内存管理、跨语言异常处理、增强安全性以及一致性和简化的编程

模型。

第3章 使用组件

习题答案

1. XML Web服务基于下面哪个协议进行通信以在应用程序之间传输XML消息?

a) DCOM

b) SOAP c) Internet d) TCP/IP

答:b

2. 下面哪个特点属于CLR实现的例外处理机制?

a) 考虑产生例外的语言

b) 考虑被调用来处理例外的语言

c) 需要特定的句法

d) 允许例外跨越过程边界和机器边界 答:d

3. 和其他错误通知方法(比如 Win32 GetLastError, DCOM的HRESULT) 相比,异常提供什么优点?

答:异常优于其他错误通知方法:

程序不会因为代码编写人员的疏忽比如忘记检查返回代码而让错误继续在系统传播

不必检查返回代码;

可以容易地添加异常处理代码,增强了程序的可靠性;

4. 如何使用try/catch/finally语句捕获异常?

答:把可能引发异常的代码放入try块中,并且把处理异常的代码置入catch块中。你也可以编写finally块,它总是运行而无须考虑try块如何运行。finally块在try块后清除资源非常有用。例如,在C#中: try {

// 可能引发异常的代码 }

catch(Exception e) { // 放置处理异常的代码 } finally {

//放置在try或catch运行之后运行的代码 }

5. .NET方法如何指出错误?

答:所有的 .NET Framework方法通过引发异常来指出错误。

6. 哪个命名空间中包含创建Windows窗体应用程序的类?

答:Windows窗体库位于System.Windows.Forms 命名空间里。

7. ASP.NET页的默认扩展名是什么?

答:默认情况下,ASP.NET文件具有aspx扩展名(用户控件文件的扩展名

是ascx)

第4章 部署与版本控制

习题答案

1. 部署应用不会使用下面哪种方式?

a) 拷贝文件局部地安装 b) 删除文件拆除应用

c) 直接从服务器运行可执行文件

d) 直接从客户机运行可执行文件 答:c

2. 版本号为2.1.2.3的程序集可能和下面哪个版本号的程序集兼容?

a) 1.1.2.3 b) 2.2.2.3 c) 2.1.5.2 d) 2.0.2.3 答:c

3. 策略解决方案不会发生在哪个阶段?

a) 编译程序策略解析 b) 发行者策略解析 c) 管理员策略解析 d) 应用程序策略解析

答:不清楚出题人\编译程序策略\和\发行者策略\指的要强调的是什么?InheritanceDemand, LinkDemand都可用来保护知识产权。 4. 解释程序集(assembly)的组成结构和作用。

答:由一个或多个PE格式文件组成的; 包含用来识别程序集及其文件的清单;

指明导出文件和导入的类 (Clsss)和类型(Type); 是部署、重用和版本控制的单元。

5. 程序集的哪一部分能够识别出它的输入类型、输出类型和它的版本信息?

答:程序集清单

6. 一台计算机要在本地运行一个.NET 应用程序时,需要什么软件?

答:.NET Framework公共语言运行库

7. 指出运行.NET Framework应用程序的两种简单方法。

答:把可执行文件复制到本地并引用本地计算机的程序集,或从文件服务器上访问它们。

8. 描述一个应用程序如何使用位于应用程序子目录中的程序集。

答:在应用程序目录创建配置文件,指定它的privatePath属性如下:

xmlns=\

9. 哪一种程序集能被放到全局程序集缓存中并能被版本化?

答:强名称程序集

10. 用于产生公钥/私钥对的是什么命令?

答:强名称工具(Sn.exe)可以用来生成一个公钥/私钥对,并把它们放置在一个sn –k orgKey.snk文件中

11. 用来把一个强名称程序集安装到全局程序集缓存中的是什么命令?

答:> gacutil -i

12. 弱名称与强名称程序集之间的区别是什么?

答:真正区别是:强名称程序集是用发布者的公/私密钥对来签署的,此公/私密钥对能够惟一识别程序集的发布者。这密钥对允许程序集被唯一识别、保护以及版本控制,它也允许程序集被部署到用户硬盘的任何地方,甚至在Internet上。当应用程序试图绑定强名称程序集时,这种惟一地识别一个程序集的能力允许CLR加强确定“知道是安全的”的策略。

全局地部署程序集是把程序集放到一些众所周知的单元,当需要查找某程序集时,CLR知道去查找它。强名称程序集可以按私有方式或全局方式部署。 一个弱名称程序集只能以私有方式部署。

第5章 通用类型系统

习题答案

1

关于C#中类的构造函数,下面描述正确的是:

a) 为了增强类的封装性,构造函数一般被声明成Private型

b) 在类中可以重载构造函数,C#会根据参数匹配原则来选择执行合适的构造函数

c) 与方法不同的是,构造函数只有void这一种返回类型 d) 构造函数如同方法一样,需要人为调用才能执行其功能 2

答:b

下面的接口声明中,哪一个是正确的? a) public interface TryInterface {

void MyMethod(); }

b) interface TryInterface: IBase {

public void MyMethod(); }

c) interface TryInterface

{

int x; }

d) interface TryInterface: TryInterface {

public void MyMethod();

} 答:a

关于枚举成员赋值,下面代码正确的答案是:

3

public enum Color: long { Red,

Yellow=6, Green, Brown=Green, Blue

}

a) Red=0

Yellow=6

Green=7 Brown=8

Blue=9 b) Red=0 Yellow=1 Green=2 Brown=3 Blue=4 c) Red=1 Yellow=6 Green=7 Brown=8 Blue=9 d) Red=0 Yellow=6

Green=7 Brown=7

4

Blue=8 答:d

下面哪个类型不是从system.object继承来的 a) 数组 b) 字符串 c) 接口 d) 类 答:c

5 值类型和引用类型的区别是什么?

答:值类型被分配在栈中,使用拷贝赋值(assigned as copies),按值传递。 引用型被分配在堆中,作为引用赋值(assigned as references),按引用传递。

6

字段和属性之间有什么不同?

答:属性是类中的值,它通过get 和 set访问器方法被访问。实际的属性数据值可以存储在类实例中,或者在访问的时候计算出来。 7

如何在C#中创建枚举? 答:使用enum关键字:

enum name : type {

……枚举成员…… }

8 9

什么是接口?

答:接口是一组相关方法和属性的约定描述。 .NET Framework是如何支持封装的?

答:封装是通过使用访问修饰符实现的,如public, protected, internal, 和 private。

10 多态的主要特点是什么?

答:多态允许定义一个基类,这个基类包括在相关对象组上执行标准操作的多个例程,而不必考虑每个对象的准确类型。

11 编写一个绘制直线的程序,该程序定义了一种枚举类型,它所包含的枚举成员是绘制实心线、圆点线和点划线型。

解:程序代码如下:

using system; public class Draw

{

public emun, LineStyle //定义枚举类型 { Solid,

}

Dotted, DotDash,

public void DrawLine(int x1, int y1, int x2, int y2, LineStyle lineStyle) {

switch (lineStyle) {

case LineStyle.Solid: //用枚举名访问枚举成员 Console.WriteLine(“画实心线”);

//draw solid

}

}

break;

case LineStyle.Dotted: //用枚举名访问枚举成员 Console.WriteLine(“画圆点线”); //draw dotted break;

case LineStyle.DotDash: //用枚举名访问枚举成员 Console.WriteLine(“画点划线”);

//draw dotdash break;

default: Console.WriteLine(“您选择了一种无效的线型”);

break;

}

class Test

{ }

public static void Main() { }

Draw draw = new Draw();

Draw.Drawline(1, 1, 5, 5, Draw.LineStyle.Solid); Draw.Drawline(2, 3, 5, 6, (Draw.LineStyle) 1); Draw.Drawline(9, 9, 100, 20, (Draw.LineStyle) 2); Draw.Drawline(5, 6, 7, 8, (Draw.LineStyle) 3);

第6章 类型的使用

习题答案

1. 为计算哈希代码而选择哈希算法时,要遵循什么原则?

答:为了获得哈希表的最佳性能,使用能提供好的随机分布的算法。 你的算法也可以调用基类的GetHashCode方法并且包括它的返回值。然而,一般不调用Object或ValueType的GetHashCode方法,因为这两个方法的实现都不会使它成为高性能的哈希算法。

算法至少应该使用一个实例字段。

理想情况下,算法所使用的字段应该是不可变更的,就是说在对象被创建时这个字段被初始化,并且在对象的整个生存周期内它们都永远不会改变。

算法应该尽可能快地执行。

具有相同值的对象应该返回相同的哈希代码。例如,具有相同文本的两个字符串对象应该返回相同的哈希代码值。

2. 如何区别“相同”和“相等”?

答:如果两个对象实际上引用的是同一个内存中的对象时,它们就是相同的。在.NET Framework 公共语言运行库中的每个对象都有一个标识,使得对象在系统中是惟一的。

在.NET Framework 公共语言运行库,可以使用Object.ReferenceEquals方法以比较相同。内部地,ReferenceEquals方法比较对象在内存中的地址,以确定它们是否为同一个对象。如果它们是同一个对象,ReferenceEquals 返回true。

对象也被比较是否“相等”。可以使用Object.Equals方法、equality运算符(==)或者inequality运算符(!=)来测试是否相等。

Equals 方法是Object 类的一部分。你应该在你的类或结构中重写此方法,以便在比较某类型的对象时执行适当的行为。默认的Object.Equals方法调用Object.ReferenceEquals,这将导致是否“相同”的比较,而不是值的比较。一般来说,应该重写==和 != 运算符,以允许用容易的语法来比较对象。

3. 应该用什么算法来实现GetHashCode方法?

答:算法应该是高效的并返回惟一的数字。

4. ToString方法的默认行为是什么?

答:ToString方法的默认行为是返回类名。

5. 如何确定两个独立的对象的引用是对同一个对象的引用?

答:使用ReferenceEquals方法比较这两个引用。

6. 如果重写了Equals方法,还应该重写什么?

答:重写= = 和 !=运算符。

7. 什么时候使用私有构造函数?

答:使用私有构造函数阻止类被实例化。这种类的一个例子是含有有静态方法和字段的singleton 类。

8. 什么时候使用隐式转换,什么时候使用显式转换?

答:使用隐式转换可以提高可读性和可使用性。当转换可能引起数据丢失或者抛出异常时使用显式转换。

9. 装箱操作什么时候发生?

答:当一个值类型被转换成Object类型时发生装箱操作。 当从Object类型中重新得到值类型时发生取消装箱操作。

10. 装箱(box)和取消装箱(unbox)如何工作?

答:如果值类型被当作引用类型处理,必须将该值类型从栈中拷贝到堆中。装

箱操作为值类型在堆中分配内存,并创建一个对新内存单元的引用,然后拷贝该值类型到新的内存单元。

如果引用类型被当作值类型处理,这个引用类型必须先被取消装箱。取消装箱操作是把一个类型从堆中拷贝到栈中的变量内。

11. 如何显式地实现一个接口?

答:不使用public访问修饰符。在字段名或方法名前面使用接口名。例如,void IFoo.DoSomething().

12. .NET中的Class是不直接支持多重继承的,但是.NET Framework公共语言运行库中却可以实现“多重继承”这一语义(semantics),请概述代码编写人员如何实现?

答:在.NET Framework公共语言运行库中,一个类只能继承惟一的一个类。然而,除了可以继承一个类之外,一个类还可以继承零个或者多个接口。接口是公共语言运行库中允许多重继承的惟一类型。

第7章 字符串、数组和集合

习题答案

1. 有关类的静态成员与实例成员,下面描述错误的是

a) 类的静态成员是属于类本身的,而实例成员则是属于类的实例的 b) 无论创建了多少个类的实例,类的静态成员都只有一个副本

c) 在C#中,类的静态成员可以通过类或类的实例来访问,而类的实例成员只能通过类的实例来访问

d) 类的静态成员能在类范围中共享,不管类生成多少个实例,所有实例都可以共

享同一个静态成员 答:c

2. 有关运算符重载,下面描述错误的是

a) 在C#中,定义运算符重载时,必须带上public和static关键字

b) 通过运算符重载,可以执行基本数据类型之外的数据类型之间的运算 c) 基本数据类型之间不允许定义运算符重载 d) 在一条语句中,有时可以定义多个重载运算符 答:d

3. 描述正则表达式类的主要用途。

答:Regex类可能是.NET Framework类库中较少为人所知、但潜在地是最有用的类,它属于System.Text.RegularExpressions命名空间。正则表达式是分析和处理文本的一种语言,Regex 代表正则表达式。 正则表达式提供了强大、灵活和高效的方法来处理文本。正则表达式的广泛的模式匹配符号表示法允许你快速地分析大量的文本,以便找到特定的字符模式;提取、编辑、替换或删除文本子字符串;或为了生成报告将提取的字符串添加到集合。

对于处理字符串(例如 HTML 处理、日志文件分析和 HTTP 标题分析)的许多应用程序而言,正则表达式是不可缺少的工具。

4. Regex支持哪几种基本操作?

答:使用正则表达式把字符串分割成子字符串以识别分隔符;

查找字符串中匹配正则表达式模式的子字符串;

使用正则表达式来识别你要替换的文本,以便执行查找和替换操作。

5. System.Collections命名空间包含哪些接口和类?

答:System.Collections命名空间了许多接口和类,它们定义了各种对象的集合,如ArrayList、CollectionBase、DictionaryBase、Hashtable、Queue、Stack和SortedList等。

6. 打印如下所示的杨辉三角形 1

1 1 1 2 1

1 3 3 1 1 4 6 4 1 1 5 10 10 5 1

1 6 15 20 15 6 1

1 7 21 35 35 21 7 1

解:根据杨辉三角形的特点:除第1列和每行上最右边的元素值全为1外,其余的每个元素值都等于与其相连的上方和左上方元素值之和,感觉上就像是一个

三角形。可以定义二维锯齿状数组方便地求解,程序代码如下: using System;

class YHtriangle {

public static void Main()

{ int k=8; //指定杨辉三角形长度

int[] [] a=new int[k][]; //定义二维锯齿状数组 for (int i=0; i

a[i]=new int[i+1];

for (int j=0; j

{ a[j][0]=1; //把第1列上的元素都赋值为1 a[j][a[j].Length-1]=1; //把每行上最右边的元素都赋值为1

for(int m=1; i

}

for (int i=0; i

}

for (int j=0; j

7. 写一段代码,从控制台读取一个整数,并且把它赋给名为aNumber的变量。

答:int aNumber = int.Parse(Console.ReadLine());

8. 当重复修改字符串时,使用哪个类可以改善性能?

答:System.Text.StringBuilder

9. 指出System.Array类实现的接口的名字并对这些接口进行简单描述。

答:ICloneable:支持克隆,用与现有的实例相同的值来创建类的新实例。

IList:表示可以独立索引的对象集合。

ICollection:为所有集合定义大小、枚举数和同步方法。

IEnumerable:公开枚举数,支持在集合上进行简单的迭代。

10. “枚举器需要是安全的”指的是什么意思?

答:即使集合被修改了,枚举数也应该对集合中保持不变的项有一个固定的视图。

11. 创建一个数组包含整数1、2和3。然后使用C#的 foreach 语句对数组进行遍历,并且将结果输出到控制台。

答:

int[ ] numbers = {1, 2, 3}; foreach (int i in numbers) { System.Console.WriteLine(\}

12. 有的类包含可被单独索引的有序对象集合,这样的类实现的接口的名字是什么?指出在System.Collections命名空间中实现了这个接口的类。

答:Array、ArrayList、StringCollection和TreeNodeCollection实现了IList 接口。

13. 关联键/值对的集合的接口的名字是什么?指出在System.Collections命名空间中实现了该接口的类。

答:Hashtable、DictionaryBase和SortedList实现了IDictionary 接口。

14. 通用的集合类需要对其中的元素进行运行时强制类型转换,以得到集合类中元素的真实类型。指出运行时强制类型转换产生的问题。

答:类型检查不能在编译时执行。

强制类型转换的性能开销。

对于值类型的集合,装箱与取消装箱的操作。

第8章 委托和事件

习题答案

1. 用户所声明的委托类型是从下面的哪个类派生的?

a) System.Delegate b) System.MulticastDelegate c) System.EventHandler d) System.TestDelegate 答:b

2. 为下面的方法编写代码,声明一个名为ProcessOrderCallback 的委托。 static public bool ProcessOrder(int Quantity, string Item) { //... }

答:

public delegate bool ProcessOrderCallback (int Quantity, string, string Item);

3. 编写代码通过实例化ProcessOrderCallback 委托并传递该实例来调用下面的EnterOrder方法 。该委托的实例引用公共类Bar的公共静态方法Foo 。 static public void EnterOrder( ProcessOrderCallback processOrderCallback) { //... };

答:

EnterOrder( new ProcessOrderCallback(Bar.Foo) );

4. 编写静态方法EnterOrder 的方法体,这个方法将问题1中声明的委托的实例作为参数。EnterOrder方法向控制台输出字符串,来提示输入一个项的名字和数量并在用户的输入中读取这些数据。EnterOrder将用此信息调用回调委托。

答:

static public void EnterOrder(

ProcessOrderCallback processOrderCallback) { Console.WriteLine(\string name = Console.ReadLine();

Console.WriteLine(\

int quantity = Int32.Parse( Console.ReadLine() );

processOrderCallback(quantity, name);

}

5. 给定如下声明部分的代码,编写代码把委托b加入a的调用列表中。 Delegate void MyDelegate() MyDelegate a, b;

a = new MyDelegate(Bar1.Foo1); b = new MyDelegate(Bar2.Foo2);

答: delegate void MyDelegate(); MyDelegate a, b;

a = new MyDelegate(Bar1.Foo1); b = new MyDelegate(Bar2.Foo2); a += b;

6. 与指针之间相比,委托有何优点?

答:可以使用委托在委托对象的内部封装对方法的引用。因为委托是类型安全的、牢靠的、托管的对象,所以它们提供了指针的所有优点,而没有指针的任何缺点。例如,委托总是指向正确的对象,并且不会破坏其他对象的内存。

7. .NET Framework中使用委托和事件的指南有哪些?

答:考虑使用动词和 Pascal 大小写约定来命名事件。Pascal大小写约定每一个单词的首字母大写。

对事件使用“引起(raise)”而不是“激发(fire)”。当在文档中提到事件时,请使用“事件被引起”而不是“事件被激发”。

对于事件的委托声明,采用void返回类型且带有两个参数,名为sender的对象源参数,和封装事件的其他任何相关信息的e 参数。委托应该返回void 并且有两个参数:引起事件的对象和事件的数据对象。

必要时,事件类可以扩展System.EventArgs和以EventArgs结束。 为事件创建一个受保护的调用方法来做到这点,为获得更大的灵活性,可以把调用的方法声明为虚方法,虚方法允许派生类重写它。这种途径允许派生类截取正由基类引起的事件,可能用自己的方法来处理它们。然而,如果类是密封的,那么方法就不应该是虚的,因为不能从它派生其他的类。

8. 什么时候使用接口?

答:如果回调函数需要复杂的行为,如当不只一个回调方法被调用时或实现多

重继承时。

9. 使用关键字event编写代码,为ProcessOrderEventHandler委托类型声明一个公共的静态事件。

答:public static event ProcessOrderEventHandler processOrderHandler; 10. 描述何时应该使用委托,何时应该使用事件。

答:

在下面的情况下使用委托:

? ?

需要C语言样式的函数指针

需要单个回调函数

? 希望注册在调用或构造时发生,而不是通过单独的add 方法 在下面的情况下使用事件:

? 客户端代码在事件发生前为回调函数注册,一般通过单独的add 方法

?

一个以上的客户端对象将受到影响

第9章 内存和资源管理

习题答案

1. 如果必须实现终结,以下哪个原则是正确的?

a) 在终结代码中调用其他对象。 b) 做关于线程ID的假设。

c) 确保调用基类中的Finalize代码。

d) 类只有托管引用并且不必管理非内存资源 答:c

2. 比较值类型和引用类型内存分配和回收的不同

答:值类型的实例存储在内存中,分配在堆栈上。内存的分配和回收自动发生

如下,

分配:当把一个值类型实例的作用域的激活记录压进堆栈时,创建该值类型实例的内存。回收:当从堆栈弹出作用域的激活记录时回收内存,该激活记录包含值类型实例。

值类型总是可以被直接访问的。由于不能创建对值类型的引用,因此不可能引用已被回收的值类型实例。结果,不存在对创建对值类型的悬垂引用的危险。

托管对象是引用类型,使用new 操作符创建。这些对象的内存被分配在公共语言运行库的托管堆中。只能通过对该存储区的引用来访问引用类型。使用引用能使得垃圾回收跟踪特别实例的显著引用,并在适当的时候释放该对象的堆内存。

当没有对托管对象的可达到的引用时,该对象的堆内存只能通过垃圾回收释放。这种机制确保不会有对该对象的已释放内存的无效引用,因此不存在悬垂引用。

3. 简单的垃圾回收使用哪些步骤?

答:1) 等待直到其他的托管线程到达安全状态;例如,挂起。 垃圾回收过程修改托管对象和它们的引用。因此它必须首先等待直到其他的托管线程被挂起。

2) 建立所有可到达对象的图形。

3) 移动可到达的对象来压缩堆。通过在堆中将可到达的对象向下移动,垃圾回收器回收堆中无法到达的对象所占用的空间。 4) 更新对被移动对象的所有应用程序引用。

4. 什么叫复活?使用复活要注意那些问题?

答:在终结过程中,当一个以前无法到达的对象从应用程序的根变成是可到达的,这个对象就复活了。例如,对象的终结代码可以为对象本身的一个全局的或静态的变量赋予一个引用。现在该对象是可到达的并且不再隶属垃圾回收。

应该尽可能地避免使用复活,因为已经调用了对象的终结代码并且可能已经释放了对象正确操作所需的资源,即使对象的内存是有效的。

也应该注意到即使类的终结代码没有复活对象,当另一个引用该对象的对象复活时,该对象仍可能复活。因此,所有的对象都应该可以处理复活。

5. 处理终结的指南是什么?

答:若要避免由.NET Framework对终结代码调用的不确定顺序导致的问题,除了细心设计之外,必须使用显式资源管理。

尽可能的避免终结,应该只在需要终结的类上实现终结,或实现C#中的析构函数。如果类只有托管引用并且不必管理非内存资源,就不应该执行终结代码。终结增加了开销和复杂度,并延迟了对象的内存资源的回收。

6. 描述在.NET Framework自动内存管理中解决的两种常见的手动内存管理的问题。

答:释放内存失败(内存泄漏)

访问无效内存(不确定的指针引用)

7. 描述用于提供隐式资源管理的.NET Framework技术。

答:在垃圾回收的终止阶段,垃圾回收调用终止代码(C#析构函数),它允

许对象在它的内存资源被释放前,正确地清除它的资源。

8. 说明为什么显式资源管理是理想的。描述类应该继承的接口和类应该实现的方法来提供显式资源管理。

答:隐式资源管理是非确定性的,因此一个应用程序不能知道释放资源的确切时间。显式资源管理允许用户调用一个方法来确定性地释放资源。因此,类应该继承Idisposable并实现它的Dispose方法。

另外,由于垃圾回收器调用终止代码顺序的不确定性,使得类在终止时引用其他对象是很危险的。因此,显式资源管理可能是类在释放资源时引用其他对象的惟一的安全方式,例如,类刷新缓冲区时。

9. 说明弱引用的目的

答:弱引用在有着大量易重构数据的应用程序中是有用的,应该维护这些数据

来改善性能。如果对象在托管堆中的内存很少时,弱引用允许垃圾回收回收这些对象。

10. 解释垃圾回收器如何使用代以及为什么要使用。

答:当垃圾回收被调用来释放堆空间时,因为它仅压缩了托管堆中包含零代对

象的部分,所以它的性能得到改善。一般地,对象越新,它的生存期越短。因此,当零代被压缩时一般就释放了足够的空间。如果零代被压缩后还不能获得足够的空间,则垃圾回收将压缩更旧的代。

第10章 数据流和文件

习题答案:

1. C#使用下面哪个对象来监控文件系统中的变化并作出反应?

a) Stream对象

b) FileSystemWatcher对象。 c) StringReader d) DirectoryInfo

答:b

2. 下面哪个属性不是用来描述SeekOrigin类偏移参考点和移动读/写位置?

a) Begin b) Current c) End d) Move 答:d

3. 下面哪个类不是FileMode参数控制类?

a) Creat b) Open

c) Close d) Append 答:c

4. 指出至少三种.NET Framework流以及它们之间的区别。

答:FileStream对文件进行读取和写入。 MemoryStream 对内存进行读取和写入。

BufferedStream用于对另外一个流进行缓冲读取和写入。 NetworkStream为网络访问提供数据的基础流

5. 指出三种基本的流操作。

答:读取、写入和查找。

6. 指出用于以二进制值形式读写基元类型的类。

答:BinaryReader和BinaryWriter。

7. 指出用于提供对文件随机访问的方法。

答:Seek。

8. 指出用于监视文件系统变化的类。

答:FileSystemWatcher。

9. 为什么使用独立存储?

答:独立存储是一种数据存储机制,通过在代码和保存的数据之间定义了标准化的关联方式,从而提供隔离性和安全性。

当应用程序在文件中存储数据时,必须小心选择文件名和存储位置,最大程度

地减小其他应用程序知道该存储位置的可能性。因此,使数据不易受到损坏。独立存储提供了管理下载Web应用程序文件来最大程度地减小存储冲突的手段。 通过独立存储,代码不再需要使用唯一路径来指定文件系统中的安全位置,就可以保护数据以防止未授权的访问。不再需要指示应用程序的存储区域位置的硬代码信息。通过独立存储,可以使部分受信任的应用程序以由计算机安全策略控制的方式存储数据。

10. 指出.NET Framework的独立存储提供给应用程序的两个重要特性。 答:隔离和安全。

11. 文件和流的主要区别是什么?

答:文件通常表示持久化保存在磁盘上的字符序列,它具有名称和路径; 而流是一个字符序列的抽象表示,它提供了一个向后备存储区(如磁盘或内存)中读取和写入字节的方法。所有表示流的类都继承自Stream类。Stream类和它的子类提供了对数据源和储存库的种类视图,并将程序员与操作系统和底层设备的具体细节隔离开。

第11章 Internet访问

习题答案

1. 下面哪个不是.NET Framework中网络流的功能?

a) 发送和接收Web数据的普通方式。

b) 和.NET Framework中流的兼容性。

c) 流用于整个.NET Framework,它提供了丰富的基础结构来处理流。 d) 流强制应用程序等待整个数据集下载完成才处理数据。 答:d

2. 下面哪个功能在Internet 应用程序上不为发送和接收数据提供安全性?

a) 直接使用套接字

b) 通过使用Web代理 c) Internet身份验证

d) .NET Framework的代码访问权限 答:a

3. 下面哪个不是URI 的组成部分?

a) 方案标识符

b) 客户机标识符 c) 路径标识符

d) 可选的查询字符串,将信息从客户端传递到服务器。

4. 命名参数与位置参数有什么不同?

答:就像为方法指定参数一样,可以在参数列表确定的位置上指明位置参数。任何命名参数值都跟在位置参数之后。

位置参数用于指定必须的信息,而命名参数用于传送特性中可选的信息。

5. 如何使用Conditional特性?

答:你可以使用Conditional特性作为C#代码中的调试帮助。取决于你定义的符号值,此特性引起了方法调用的条件编译。

应用Conditional特性的方法将受到许多限制束。特别地,它们必须有一个void的返回类型,决不能被标记为override,而且它们不能是来自继承接口的方法的实现。

Conditional 特性不会导致方法本身的条件编译。特性只决定当调用方法时会发生的行动。如果需要方法的条件编译,你必须在代码中使用#if 和 #endif指令。

6. 可以用属性标记单个对象吗?

答:不能。属性可以与类或其他类型相关联,也可以与方法、参数、返回值、构造函数、程序集、委托、事件、接口、属性或字段相关联,但不能与单个对象相关联。

7. 属性值被存储在哪里?

答:属性值与其所使用的编程元素的元数据存储在一起。

8. 在运行时使用什么机制来确定一个属性的值?

答:反射。

9. 定义一个名为CodeTestAttributes的只能用于类的属性类。 它没有定位参数,但有两个名为 Reviewed 和HasTestSuite的命名参数。这些参数都应该是bool类型的,并且应该使用读/写属性来实现。

答:

using System;

[AttributeUsage(AttributeTargets.Class)] public class CodeTestAttributes: System.Attribute {

public bool Reviewed {

get { return reviewed; } set { reviewed = value; } }

public bool HasTestSuite {

get { return hasTestSuite; } set { hasTestSuite = value; } }

private bool reviewed, hasTestSuite; }

10. 定义一个名为Widget的类,并使用CodeTestAttributes(前一个问题的解答)将Widget标记为已被检查,但还没有测试过。

答: [CodeTestAttributes(Reviewed=true, HasTestSuite=false)] class Widget { ... }

11. 假定前面问题的Widget有一个名为LogBug的方法。那么CodeTestAttributes可以用来只标记该方法吗?

答:不可以。CodeTestAttributes只能用于整个类。

答:b

4. 下面哪个许可控制应用程序在本地端口接受data的权利?

a) Web许可 (WebPermission) b) 应用程序许可

c) 管套许可 (SocketPermission) d) 安全许可(SecurityPermission)。

答:c

5. 指出URI的四个组成部分:http://www.microsoft.com/default.htm?foo=bar

答:方案标识符 http 服务器标识符

www.Microsoft.com

路径标识符 /default.htm 查询字符串 ?foo=bar

6. 写一行代码,创建一个到问题1中的URI的WebRequest。

答:

WebRequest req = WebRequest.Create(\m?foo=bar\

7. 写一行代码来从练习2中的WebRequest 得到一个WebResponse 。

答:

WebResponse resp = req.GetResponse();

8. 写一行代码来从练习3中的WebResponse 得到一个Stream 。

答:

Stream respstrm = resp.GetResponseStream();

9. 指出由GetResponse 方法引发的Web特定类型的异常。

答:WebException

10. 说明如何用WebRequest 来使用安全套接字层协议。

答:URI 以https开头。

11. 指出至少三种.NET Framework.支持的身份认证方法。

答:基本身份验证

摘要式身份验证 协商身份验证 NTLM Kerberos

12. 如何更加有效地使用包含System.Net命名空间中的类?

答:尽可能地使用WebRequest 和WebResponse,而不是强制类型转换到派生类。

当编写运行在使用System.Net命名空间中的类的服务器上的ASP.NET 应用程序时,从性能的观点,对GetResponse 和GetResponseStream使用异步方法通常较好。

在ServicePoint 实例中为应用程序设置ConnectionLimit属性。到Internet 资源的连接数对网络的性能和吞吐量有意义重大的效果。默认情况下,System.Net对每个主机的每个应用程序使用两个连接。通过在ServicePoint 实例中为应用程序设置ConnectionLimit 属性可以增加连接数的值。

当写套接字层协议时,尝试使用TcpClient 或UdpClient 类,而不是直接写套接字。TcpClient 和UdpClient 类封装了TCP和UDP套接字的实现,不需要你处理连接的细节。

当访问需要凭据的站点时,使用CredentialCache 类创建一个凭据缓存,而不是为每个请求都提供凭据。CredentialCache 类将为每个请求在缓存中查找适合的凭据,因此使你从创建和提交基于URI的凭据中解脱出来。

第12章 序列化

习题答案:

1. 下面哪个类用来将数据流格式化为XML?

a) SoapFormatter

b) BinaryFormatter c) XMLFormatter d) ObjectFormatter 答:a

2. 你不可以序列化成下面哪个类的流

a) FileStream b) MemoryStream c) NetworkStream d) InfoStream 答:d

3. 序列化和反序列化指的是什么?

答:序列化是把一个对象图形转换为一个线性的字节序列的过程。该字节序列可以被传送到其他地方--例如,到一台远程的计算机--并被反序列化,即在远程计算机内存中创建了一个对象的原始图形的克隆。

4. 对象图形有何作用?图形中的流输出对象的顺序和数字有何影响?

答:对象图形是一组互相引用的对象。序列化必须提供一种方式来表示在序列化过程中创建的序列流中图形对象之间的链接。

流输出对象的顺序没有关系,分配给每个对象的数字也没关系。重要的是两个不同的对象不能分配相同的数字。对象数字只有在序列化流中才是至关重要的。它们是仅仅是表示图形拓扑结构的一种方式,并且允许你重建图形的副本(或许在另一台计算机上)。

5. 序列化使用了几个类来创建和跟踪对象的ID号码?

答:ObjectIDGenerator类为对象生成ID号码。它跟踪已经被见过的对象, ObjectManager 类在对象被反序列化时对它们进行跟踪。

6. 声明一个名为Foo 的可序列化类,这个类带有两个整数类型的字段F1 和F2 ,其中F2 是瞬时的,不应该被序列化。 答:

[Serializable] public class Foo {int F1; [NonSerialized] int F2};

7. 说出.NET Framework提供的两种类型的格式化程序的名字,并描述功能。

答:为简洁的二进制格式提供的BinaryFormatter 为XML表示提供的SoapFormatter

8. 描述如何使一个类实现自定义的序列化。

答:类应该继承自Iserializable接口、实现接口的GetObjectData方法、并提供一个带 SerializationInfo和StreamingContext 参数的构造函数

9. 哪种数据通常不能被客户访问,但可以通过序列化来使它对于客户可见?

答:私有对象状态

第13章 远程处理和XML Web Service

习题答案:

1. NET Framework remoting服务架构的构成?

答:可替换的通讯信道(channel)负责在本地和远程应用程序之间传输消息; 格式器(formatter)在通过信道传输消息之前对其进行编码和解码; 代理(proxy)把远程方法调用转发给合适的对象; 远程对象的激活(activation)和生存期支持。

2. 信道选择受什么规则支配?

答:注册对象前必须已经注册信道。在可以调用远程对象之前,至少有一个信道必须用远程处理基础结构注册。

基于每个应用程序域(AppDomain)来注册信道。单个进程中可能包含多个应用程序域。如果某进程死亡,则它注册的所有信道都自动被销毁。

注册一个信道来侦听另一个信道正在侦听的相同端口是无效的。虽然信道基于每个应用程序域(AppDomain)进行注册,同一台计算机上的不同应用程序域也不能注册侦听相同端口的同一信道。

3. 说明租约机制的用途和潜在缺点。

答:使用租约机制,可以控制客户端激活的远程对象的生存期。当对象第一次被创建时,就给定一个租约时间。当对象的租约时间到达零时,对象就与远程基础

结构断开连接。在对象的应用程序域中的对象引用都被释放后,该对象可能在下一次垃圾回收发生时被收集。

使用租约管理远程对象的生存期是作为引用计数的一种替代,引用计数在不可靠的网络连接中倾向于比较复杂且低效。

租约的一个潜在缺点是远程对象的生存期被延伸的时间可能超过所需要的。然而,减少了专用于引用计数和客户端进行ping操作的网络通信量的优点超过了远程对象延长生存期的缺点。

4. 通用描述、发现和集成项目的用途是什么?

答:通用描述、发现和集成(UDDI)项目是一个跨行业的项目,它致力于创建一个独立于平台的开放框架,用于描述Web服务、发现业务以及集成使用Internet的业务服务。这个项目由所有的主要平台和软件提供商、市场经营者和电子商务领导者的驱动。

UDDI站点本身就是 Web服务。它们公布一对基于SOAP的API:inquiry API用于查询公司和公司的Web服务,而publisherAPI用于广告某公司的Web服务。任何人都可以调用 inquiry API,但运行站点典型地限制发行人API给已注册成员。

5. 同一计算机上的两个应用程序域都有一个信道,这两个信道能否侦听相同的端口号?

答:端口是机器范围内资源。因此,在同一计算机上,注册侦听同一端口号的

多个信道是非法的,即使信道是在不同应用程序域中注册的。

6. 代理的用途是什么?

答:代理对象作为远程对象的代表,确保在代理上产生的所有调用都被转发给正确的远程对象实例。所有对代理进行的方法调用都自动转发到远程类,并且所有的结果都返回给客户端。

7. 远程实例化的对象能以值的形式被返回吗?

答:不可以。所有被远程实例的对象都只能通过引用返回。

8. 是什么决定远程实例化的对象的参数和返回值是以引用形式传递还是以值形式传递?

答:标记为 SerializableAttribute的类的对象是值封送的,而继承自System.MarshalByRefObject的对象是引用封送的。

9. ASP.NET承载的XML Web service通常使用的文件扩展名是什么?

答:ASP.NET 用 .asmx文件提供对XML Web service的支持。

10. 在ASP.NET中,你如何指定一个定义在预先生成程序集中的服务?而与ASP.NET 应用程序相关的程序集的DLL又应该位于哪里?

答:.asmx 文件应该包含单行:

<%@ WebService Class=\程序集库DLL应该在应用程序的\\Bin 子目录下。

11. 当一个XML Web service不是由.NET Framework实现或者该XML Web service的程序集或源代码不可用时,客户端如何调用它?

答:Web服务描述语言工具(Wsdl.exe)可以用于读取XML Web service 的WSDL描述,并创建一个代理类。客户端可以使用该代理类来调用XML Web service.方法。

12. 下面哪个不是代理(proxy)访问远程对象应执行的任务?

a) 代表在客户应用域的远程对象 b) 转发客户的调用

c) 返回结果和例外

d) 用显式的客户调用进行实例化 答:d

第14章 线程与异步编程

习题答案

1. 下面哪个不是使用多个线程的优点?

a) 线程使应用程序内的多个活动看起来似乎是在同时发生 b) 可以使用线程来区分不同优先级的任务

c) 在等待事件完成时多个线程使处理器可以处理单独的任务。 d) 多个线程会带来争用条件和死锁 答:d

2. 前台线程和前台线程的区别是什么?

答:后台线程不会使托管执行环境处于活动状态,除此之外,后台线程与前台线程是一样的。

应用程序只有在所有的前台线程都已经停止后才能停止运行。然而,它可以在

后台线程还在运行的时候停止运行。当宿主它们的应用程序停止时,后台线程会自动停止。

所有的前台线程在托管进程(其中.exe文件是托管程序集)中被停止后,系统将停止所有的后台线程并关闭。通过设置Thread.IsBackground 属性,可以将一个线程指定为后台线程或前台线程。

3. 应用程序域宿主线程与COM 线程处理模型有什么不同?

答:尽管在应用程序域宿主线程与COM 线程处理模型中关于单元(apartment)的使用在概念上是相似的,但是它们之间有重要的区别:

应用程序域是托管的类型,而COM 线程处理模型是构造在非托管的架构之上的。

4. 如何最佳地使用线程?

答:避免提供改变静态状态的静态方法;

静态状态必须是线程安全的; 实例状态不必是线程安全的;

本文来源:https://www.bwwdw.com/article/3e1v.html

Top