




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1章Microsoft.NETFramework概要
习题答案
1..NETFramework不支持哪种类型的用户界面?
a)Web窗体
b)Windows窗体
c)公共语言运行库
d)控制台应用程序
答:C
2.下面哪个不是.NETFramework类库的主要特点和提供的高级服务:
a)跻语言继承和调试
b)很容易学习和掌握
c)是面向对象
d)是安全且易于扩充
答:b
3.垃圾收集器要求程序员
a)为对象分配内存并在使用完毕后可不必释放它。
b)为对象分配内存但在使用完毕后要释放它。
c)不必为对象分配内存但在使用完毕后要释放它。
d)不必为对象分配内存且在使用完毕后可不必释放它。
答:a
4.列出.NETFramework的组件。
答:公共语言运行库(CLR)、.NETFramework类库、数据和XML、XMLWeb
service,Web窗体和Windows窗体。
5.公共语言运行库的用途是什么?
答:公共语言运行库(CLR)提供执行代码的环境、编译器、语言独立性和轻便
性、以及执行垃圾回收。
6.公共语言规范的用途是什么?
答:公共语言规范(CLS)定义了一套所有与.NET兼容的语言应该支持的特性。
7.什么是XMLWebService?
答:XMLWebservice是可编程的Web组件,它可以在Internet或者企业内
部网的Web应用程序之间共享。
8.什么是托管环境?
答:托管环境提供一些服务,如垃圾回收、安全性以及其他类似的特性。
9.如何从某类的全名中识别它的命名空间名称和类型名称
答:因为.NETFramework类库中包含数百个类,所以将这些类分组到命名空
间中。全名的第一部分(最右边点的前面部分)是命名空间名称。全名的最后一部
分(最右边点的后面部分)是类型名称。
10..NETFramework类库(FCL)如何组织其众多的类型?
答:由于.NETFramework类库(FCL)包含了如此众多类型的定义,所以类
库要以层次的命名空间结构来进行组织。
命名空间使用点句法命名方案将有关联的类逻辑分组,以便易于对其进行搜索
和引用。
11.解释什么叫托管代码。
答:以CLR为目标的代码称为托管代码,它由伪机器语言编写的指令组成,
这种语言也称为通用中间语言(CommonIntermediateLanguage,CIL)。CIL指令
可在运行时实时(JIT)编译为本机代码(典型的x86代码)。
第2章托管执行环境的介绍
习题答案
1.元数据(metadata)类型不支持运行库做下面哪个功能?
a)外部注册
b)设定运行时上下文边界
c)消解方法调用
d)提供反射功能
答:a
2.共语言运行库提供下面哪个工具来测试和调试MSIL?
a)MSIL编译程序
b)只有MSIL反汇编程序
OMSIL编译程序和MSIL反汇编程序
d)MSIL程序集和MSIL反汇编程序
答:d
3.关于命名空间,下面正确的说法是哪个?
a)命名空间不能嵌套另一个命名空间
b)在不同命名空间中,类型可以具有相同的名字
c)一个命名空间不能在多个文件中定义
d)单独一个源代码文件不能定义多个命名空间
答:b
4.在默认情况下,同一命名空间的成员具有的访问性是
a)public
b)protect
c)internal
d)private
答:c
5.下面哪一一个命名空间声明的类与其他三个不同?
a).namespaceMySchool.FirstNamespace
(
classClassA{}
classClassB(}
)
b).namespaceMySchool.FirstNamespace
(
classClassA)}
)
namespaceMySchool.FirstNamespace
(
classClassB(}
)
c).namespaceMySchool
(
namespaceFirstNamespace
(
classClassA{}
)
classClassB{}
)
d).namespaceMySchool
(
namespaceFirstNamespace
(
classClassA{}
classClassB{}
)
)
答:c
6..NETFramework中类型的根命名空间名称是什么?
答:System命名空间是.NETFramework中类型的根命名空间。
7.应用程序可以使用什么类和方法来对控制台进行输入和输出?
答:在公共语言运行库中,你可以使用System命名空间中的Console类的
Read、ReadLine.Write和WHteLine等方法,实现向控制台输入输出字符串或数
值。
8.当编译引用程序集中类(除mscorlib.dll夕卜)的代码时,你必须做什么?
答:必须使用/reference编译开关选项。使用/reference编译选项后,编译器
使指定库中的信息对当前正在编译的源程序可用。”开关等效于/reference开关。
9..NET编译器产生的代码叫什么?
答:Microsoft中间语言(MSIL),有时也叫托管代码。
10.哪一个.NET组件将MSIL编译成特定于CPU的本机代码?
答:实时(JIT)编译器。
11..NET的哪个特性确保对象占用的内存被回收?
答:垃圾回收过程。
12.公共语言运行库有什么优点?
答:所有托管代码都通过使用公共语言运行库运行,公共语言运行库提供了跨
语言集成、自动内存管理、跨语言异常处理、增强安全性以及一致性和简化的编程
模型。
第3章使用组件
习题答案
1.XMLWeb服务基于下面哪个协议进行通信以在应用程序之间传输XML消息?
a)DCOM
b)SOAP
c)Internet
d)TCP/IP
答:b
2.下面哪个特点属于CLR实现的例外处理机制?
a)考虑产生例外的语言
b)考虑被调用来处理例外的语言
c)需要特定的句法
d)允许例外跨越过程边界和机器边界
答:d
3.和其他错误通知方法(比如Win32GetLastError,DCOM的HRESUET)相比,异常提供
什么优点?
答:异常优于其他错误通知方法:
程序不会因为代码编写人员的疏忽比如忘记检查返回代码而让错误继续在系
统传播
不必检查返回代码;
可以容易地添加异常处理代码,增强了程序的可靠性:
4.如何使用try/catch/finally语句捕获异常?
答:把可能引发异常的代码放入try块中,并且把处理异常的代码置入catch
块中。你也可以编写什nally块,它总是运行而无须考虑try块如何运行。finally块
在try块后清除资源非常有用。例如,在C#中:
try{
//可能引发异常的代码
)
catch(Exceptione){
//放置处理异常的代码
)
finally{
//放置在try或catch运行之后运行的代码
5..NET方法如何指出错误?
答:所有的.NETFramework方法通过引发异常来指出错误。
6.哪个命名空间中包含创建Windows窗体应用程序的类?
答:Windows窗体库位于System.Windows.Forms命名空间里。
7.ASP.NET页的默认扩展名是什么?
答:默认情况下,ASP.NET文件具有aspx扩展名(用户控件文件的扩展名
是ascx)
第4章部署与版本控制
习题答案
i.部署应用不会使用下面哪种方式?
a)拷贝文件局部地安装
b)删除文件拆除应用
c)直接从服务器运行可执行文件
d)直接从客户机运行可执行文件
答:c
2.版本号为2.123的程序集可能和下面哪个版本号的程序集兼容?
a)
b)
c)
d)
答:C
3.策略解决方案不会发生在哪个阶段?
a)编译程序策略解析
b)发行者策略解析
c)管理员策略解析
d)应用程序策略解析
答:不清楚出题人”编译程序策略”和“发行者策略"指的要强调的是什么?
InheritanceDemand,LinkDemand都可用来保护知识产权。
4.解释程序集(assembly)的组成结构和作用。
答:由一个或多个PE格式文件组成的;
包含用来识别程序集及其文件的清单;
指明导出文件和导入的类(Clsss)和类型(Type);
是部署、重用和版本控制的单元。
5.程序集的哪一部分能够识别出它的输入类型、输出类型和它的版本信息?
答:程序集清单
6.哈计算机要在本地运行一个.NET应用程序时,需要什么软件?
答:.NETFramework公共语言运行库
7.指出运行.NETFramework应用程序的两种简单方法。
答:把可执行文件复制到本地并引用本地计算机的程序集,或从文件服务器上
访问它们。
8.描述一个应用程序如何使用位于应用程序子目录中的程序集。
答:在应用程序目录创建配置文件,指定它的privatePath属性如下:
<configuration>
<runtime>
<assemblyBinding
xmlns="urn:schemas-microsoft-com:asm.vl">
<probingprivatePath=,'MyStringer'7>
</assemblyBinding>
</runtime>
</configuration>
9.哪一种程序集能被放到全局程序集缓存中并能被版本化?
答:强名称程序集
10.用于产生公钥/私钥对的是什么命令?
答:强名称工具(Sn.exe)可以用来生成一个公钥/私钥对,并把它们放置在一
个sn-korgKey.snk文件中
11.用来把一个强名称程序集安装到全局程序集缓存中的是什么命令?
答:>gacutil-i<filename>
12.弱名称与强名称程序集之间的区别是什么?
答:真正区别是:强名称程序集是用发布者的公/私密钥对来签署的,此公/私
密钥对能够惟一识别程序集的发布者。这密钥对允许程序集被唯一识别、保护以及
版本控制,它也允许程序集被部署到用户硬盘的任何地方,甚至在Internet上。当
应用程序试图绑定强名称程序集时,这种惟一地识别一个程序集的能力允许CLR
加强确定“知道是安全的”的策略.
全局地部署程序集是把程序集放到一些众所周知的单元,当需要查找某程序集
时,CLR知道去查找它。强名称程序集可以按私有方式或全局方式部署。
一个弱名称程序集只能以私有方式部署。
第5章通用类型系统
习题答案
1关于C#中类的构造函数,下面描述正确的是:
a)为了增强类的封装性,构造函数一般被声明成Private型
b)在类中可以重载构造函数,C#会根据参数匹配原则来选择执行合适的构造函
数
C)与方法不同的是,构造函数只有void这•种返回类型
d)构造函数如同方法一样,需要人为调用才能执行其功能
答:b
2下面的接口声明中,哪一个是正确的?
a)publicinterfaceTrylnterface
(
voidMyMethod();
)
b)interfaceTrylnterface:IBase
(
publicvoidMyMethod();
c)interfaceTrylnterface
inix;
d)interfaceTryInterface:Trylnterface
(
publicvoidMyMethod();
)
答:a
3关于枚举成员赋值,下面代码正确的答案是:
publicenumColor:long
(
Red,
Yellow=6,
Green,
Brown=Green,
Blue
)
a)Red=0
Yellow=6
Green=7
Brown=8
Blue=9
b)Red=0
Yellow=l
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
Blue=8
答:d
4下面哪个类型不是从system.object继承来的
a)数组
b)字符串
c)接口
d)类
答:c
5值类型和引用类型的区别是什么?
答:值类型被分配在栈中,使用拷贝赋值(assignedascopies),按值传递。
引用型被分配在堆中,作为弓I用赋值(assignedasreferences),按引用传递。
6字段和属性之间有什么不同?
答:属性是类中的值,它通过get和set访问器方法被访问。实际的属性数
据值可以存储在类实例中,或者在访问的时候计算出来。
7如何在C#中创建枚举?
答:使用enum关键字:
enumname:type
(
……枚举成员……
)
8什么是接口?
答:接口是一组相关方法和属性的约定描述。
9.NETFramework是如何支持封装的?
答:封装是通过使用访问修饰符实现的,如public,protected,internal,和
privateo
10多态的主要特点是什么?
答:多态允许定义一个基类,这个基类包括在相关对象组上执行标准操作的多
个例程,而不必考虑每个对象的准确类型。
11编写一个绘制直线的程序,该程序定义了•种枚举类型,它所包含的枚举成员是绘
制实心线、圆点线和点划线型。
解:程序代码如下:
usingsystem;
publicclassDraw
(
publicemun,LineStyle〃定义枚举类型
{
Solid,
Dotted,
DotDash,
)
publicvoidDrawLine(intxl,intyl,intx2,inty2,LineStylelineStyle)
(
switch(lineStyle)
(
caseLineStyle.Solid:〃用枚举名访问枚举成员
Console.WriteLine(“画实心线'');
//drawsolid
break;
caseLineStyle.Dotted:〃用枚举名访问枚举成员
Console.WriteLine(uiffli圆点线”);
//drawdotted
break;
caseLineStyle.DotDash:〃用枚举名访问枚举成员
Console.WriteLine(“画点划线”);
//drawdotdash
break;
default:
Console.WriteLine(“您选择了一种无效的线型”);
break;
)
)
)
classTest
(
publicstaticvoidMain()
(
Drawdraw=newDraw();
Draw.Drawline(l,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章类型的使用
习题答案
I.为计算哈希代码而选择哈希算法时,要遵循什么原则?
答:为了获得哈希表的最佳性能,使用能提供好的随机分布的算法。
你的算法也可以调用基类的GetHashCode方法并且包括它的返回值。然而,
一般不调用Object或ValueType的GetHashCode方法,因为这两个方法的实现
都不会使它成为高性能的哈希算法。
算法至少应该使用一个实例字段。
理想情况下,算法所使用的字段应该是不可变更的,就是说在对象被创建时这
个字段被初始化,并且在对象的整个生存周期内它们都永远不会改变。
算法应该尽可能快地执行。
具有相同值的对象应该返回相同的哈希代码。例如,具有相同文本的两个字符
串对象应该返回相同的哈希代码值。
2.如何区别“相同”和“相等”?
答:如果两个对象实际上引用的是同一个内存中的对象时,它们就是相同的。
在.NETFramework公共语言运行库中的每个对象都有一个标识,使得对象在系
统中是惟一的。
在.NETFramework公共语言运行库,可以使用Object.ReferenceEquals方
法以比较相同。内部地,ReferenceEquals方法比较对象在内存中的地址,以确定
它们是否为同一个对象。如果它们是同一个对象,ReferenceEquals返回true。
对象也被比较是否“相等”。可以使用Object.Equals方法、equally运算符
(==)或者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访问修饰符。在字段名或方法名前面使用接口名。例如,
voidIFoo.DoSomething().
12..NET中的Class是不直接支持多重继承的,但是.NETFramework公共语言运行库
中却可以实现“多重继承”这一语义(semantics),请概述代码编写人员如何实现?
答:在.NETFramework公共语言运行库中,一个类只能继承惟一的一个类。
然而,除了可以继承一个类之外,一个类还可以继承零个或者多个接口。接口是公
共语言运行库中允许多重继承的惟一类型。
第7章字符串、数组和集合
习题答案
i.有关类的静态成员与实例成员,下面描述错误的是
a)类的静态成员是属于类本身的,而实例成员则是属于类的实例的
b)无论创建了多少个类的实例,类的静态成员都只有一个副本
c)在C#中,类的静态成员可以通过类或类的实例来访问,而类的实例成员只能
通过类的实例来访问
d)类的静态成员能在类范围中共享,不管类生成多少个实例,所有实例都可以共
享同一个静态成员
答:C
2.有关运算符重载,下面描述错误的是
a)在C#中,定义运算符重载时,必须带上public和static关键字
b)通过运算符重载,可以执行基本数据类型之外的数据类型之间的运算
c)基本数据类型之间不允许定义运算符重载
d)在一条语句中,有时可以定义多个重载运算符
答:d
3.描述正则表达式类的主要用途。
答:Regex类可能是.NETFramework类库中较少为人所知、但潜在地是最有
用的类,它属于System.Text.RegularExpressions命名空间。正则表达式是分析
和处理文本的一种语言,Regex代表正则表达式。
正则表达式提供了强大、灵活和高效的方法来处理文本。正则表达式的广泛的
模式匹配符号表示法允许你快速地分析大量的文本,以便找到特定的字符模式;提
取、编辑、替换或删除文本子字符串;或为了生成报告将提取的字符串添加到集合。
对于处理字符串(例如HTML处理、日志文件分析和HTTP标题分析)的许多
应用程序而言,正则表达式是不可缺少的工具。
4.Regex支持哪几种基本操作?
答:使用正则表达式把字符串分割成子字符串以识别分隔符;
查找字符串中匹配正则表达式模式的子字符串;
使用正则表达式来识别你要替换的文本,以便执行查找和替换操作。
5.System.Collections命名空间包含哪些接口和类?
答:System.Collections命名空间了许多接口和类,它们定义了各种对象的集
合,如ArrayList、CollectionBase、DictionaryBase,Hashtable、Queue.Stack
和SortedList等。
6.打印如下所示的杨辉三角形
解:根据杨辉三角形的特点:除第1列和每行上最右边的元素值全为1外,
其余的每个元素值都等于与其相连的上方和左上方元素值之和,感觉上就像是一个
三角形。可以定义二维锯齿状数组方便地求解,程序代码如下:
usingSystem;
classYHtriangle
(
publicstaticvoidMain()
(
intk=8;//指定杨辉三角形长度
int[][]a=newint[kl[];//定义二维锯齿状数组
for(inti=0;io.Length;i++)〃初始化数组中的元素
a[i]=newint[i+ll;
for(intj=0;j<a.Length;j++)
(
aUJ[O]=l;〃把第1列上的元素都赋值为1
a[j][a[j].Length-l]=l;〃把每行上最右边的元素都赋值为1
for(intm=];i<a|jJ,Length-l;m++)
a[j][m]=a[j-l][m-l]+a[j-l][ni];〃计算其余元素的值
)
for(inti=0;i<a.Length;i++)//输出杨辉三角形
for(intj=0;j<a[i].Length;j++)
Console.WriteC{0}\f,,a[i][j]);
Console.Write(“\n”};
7.写一段代码,从控制台读取一个整数,并且把它赋给名为aNumber的变量。
答:intaNumber=int.Parse(Console.ReadLine());
8.当重复修改字符串时,使用哪个类可以改善性能?
答:System.Text.StringBuilder
9.指出System.Array类实现的接口的名字并对这些接口进行简单描述。
答:ICIoneable:支持克隆,用与现有的实例相同的值来创建类的新实例。
IList:表示可以独立索引的对象集合。
[Collection:为所有集合定义大小、枚举数和同步方法。
Enumerable:公开枚举数,支持在集合上进行简单的迭代。
10.“枚举器需要是安全的”指的是什么意思?
答:即使集合被修改了,枚举数也应该对集合中保持不变的项有一个固定的视
图。
11.创建一个数组包含整数1、2和3。然后使用C#的foreach语句对数组进行遍历,并且
将结果输出到控制台。
答:
int[]numbers={1,2,3);
foreach(intiinnumbers){
System.Console.WriteLine("Number:(0)",i);
12.有的类包含可被单独索引的有序对象集合,这样的类实现的接口的名字是什么?指出在
System.Collections命名空间中实现了这个接口的类。
答:Array、ArrayListStringCollection和TreeNodeCollection实现了IList接
口。
13.关联键/值对的集合的接口的名字是什么?指出在SystemCollections命名空间中实现了
该接口的类。
答:Hashtable、DictionaryBase和SortedList实现了IDictionary接口。
14.通用的集合类需要对其中的元素进行运行时强制类型转换,以得到集合类中元素的真实
类型。指出运行时强制类型转换产生的问题。
答:类型检查不能在编译时执行。
强制类型转换的性能开销。
对于值类型的集合,装箱与取消装箱的操作。
第8章委托和事件
习题答案
1.用户所声明的委托类型是从下面的哪个类派生的?
a)System.Delegate
b)System.MulticastDelegate
c)System.EventHandler
d)System.TestDelegate
答:b
2.为下面的方法编写代码,声明一个名为ProcessOrderCallback的委托。
staticpublicboolProcessOrder(intQuantity,
stringItem){II...
)
答:
publicdelegateboolProcessOrderCallback(intQuantity,string,stringItem);
3.编写代码通过实例化ProcessOrderCallback委托并传递该实例来调用下面的EnterOrder
方法。该委托的实例引用公共类Bar的公共静态方法Foo。
staticpublicvoidEnterOrder(
ProcessOrderCallbackProcessOrderCallback)
{//...
);
答:
EnterOrder(newProcessOrderCallback(Bar.Foo));
4.编写静态方法EnterOrder的方法体,这个方法将问题1中声明的委托的实例作为参数。
EnterOrder方法向控制台输出字符串,来提示输入一个项的名字和数量并在用户的输入中读
取这些数据。EnterOrder将用此信息调用回调委托。
答:
staticpublicvoidEnterOrder(
ProcessOrderCallbackProcessOrderCallback){
Console.WriteLine("EnterItemName:");
stringname=Console.ReadLine();
Console.WriteLine(HEnterItemQuanity:'1);
intquantity=Int32.Parse(Console.ReadLine());
processOrderCallback(quantity,name);
)
5.给定如下声明部分的代码,编写代码把委托b加入a的调用列表中。
DelegatevoidMyDelegate()
MyDelegatea,b;
a=newMyDelegate(Bar1.Foo1);
b=newMyDelegate(Bar2.Foo2);
答:
delegatevoidMyDelegate();
MyDelegatea,b;
a=newMyDelegate(Bar1.Foo1);
b=newMyDelegate(Bar2.Foo2);
a+=b;
6.与指针之间相比,委托有何优点?
答:可以使用委托在委托对象的内部封装对方法的引用。因为委托是类型安全
的、牢靠的、托管的对象,所以它们提供了指针的所有优点,而没有指针的任何缺
点。例如,委托总是指向正确的对象,并且不会破坏其他对象的内存。
7..NETFramework中使用委托和事件的指南有哪些?
答:考虑使用动词和Pascal大小写约定来命名事件。Pascal大小写约定每
一个单词的首字母大写。
对事件使用“引起(raise)”而不是“激发(fire)”。当在文档中提到事件
时,请使用“事件被引起”而不是“事件被激发”。
对于事件的委托声明,采用void返回类型且带有两个参数,名为sender的对
象源参数,和封装事件的其他任何相关信息的e参数。委托应该返回void并且有
两个参数:引起事件的对象和事件的数据对象。
必要时,事件类可以扩展System.EventArgs和以EventArgs结束。
为事件创建一个受保护的调用方法来做到这点,为获得更大的灵活性,可以把
调用的方法声明为虚方法,虚方法允许派生类重写它。这种途径允许派生类截取正
由基类引起的事件,可能用自己的方法来处理它们。然而,如果类是密封的,那么
方法就不应该是虚的,因为不能从它派生其他的类。
8.什么时候使用接口?
答:如果回调函数需要复杂的行为,如当不只一个回调方法被调用时或实现多
重继承时。
9.使用关键字event编写代码,为ProcessOrderEventHandler委托类型声明一个公共的静
态事件。
答:publicstaticeventProcessOrderEventHandlerprocessOrderHandler;
10.描述何时应该使用委托,何时应该使用事件。
答:
在下面的情况下使用委托:
・需要C语言样式的函数指针
•需要单个回调函数
・希望注册在调用或构造时发生,而不是通过单独的add方法
在下面的情况下使用事件:
•客户端代码在事件发生前为回调函数注册,一般通过单独的add方法
・一个以上的客户端对象将受到影响
第9章内存和资源管理
习题答案
i.如果必须实现终结,以下哪个原则是正确的?
a)在终结代码中调用其他对象。
b)做关于线程ID的假设。
c)确保调用基类中的Finalize代码。
d)类只有托管引用并且不必管理非内存资源
答:C
2.比较值类型和引用类型内存分配和回收的不同
答:值类型的实例存储在内存中,分配在堆栈上。内存的分配和回收自动发生
如下,
分配:当把一个值类型实例的作用域的激活记录压进堆栈时,创建该值类型实
例的内存。回收:当从堆栈弹出作用域的激活记录时回收内存,该激活记录包含值
类型实例。
值类型总是可以被直接访问的。由于不能创建对值类型的引用,因此不可能引
用已被回收的值类型实例。结果,不存在对创建对值类型的悬垂引用的危险。
托管对象是引用类型,使用new操作符创建。这些对象的内存被分配在公共
语言运行库的托管堆中。只能通过对该存储区的引用来访问引用类型。使用引用能
使得垃圾回收跟踪特别实例的显著引用,并在适当的时候释放该对象的堆内存。
当没有对托管对象的可达到的引用时,该对象的堆内存只能通过垃圾回收释
放。这种机制确保不会有对该对象的已释放内存的无效引用,因此不存在悬垂引用。
3.简单的垃圾回收使用哪些步骤?
答:1)等待直到其他的托管线程到达安全状态;例如,挂起。
垃圾回收过程修改托管对象和它们的引用。因此它必须首先等待直到其他的托
管线程被挂起。
2)建立所有可到达对象的图形。
3)移动可到达的对象来压缩堆。通过在堆中将可到达的对象向下移动,垃圾
回收器回收堆中无法到达的对象所占用的空间。
4)更新对被移动对象的所有应用程序引用。
4.什么叫复活?使用复活要注意那些问题?
答:在终结过程中,当一个以前无法到达的对象从应用程序的根变成是可到达
的,这个对象就复活了。例如,对象的终结代码可以为对象本身的一个全局的或静
态的变量赋予一个引用“现在该对象是可到达的并且不再隶属垃圾回收。
应该尽可能地避免使用复活,因为已经调用了对象的终结代码并且可能已经释
放了对象正确操作所需的资源,即使对象的内存是有效的。
也应该注意到即使类的终结代码没有复活对象,当另一个引用该对象的对象复
活时,该对象仍可能复活。因此,所有的对象都应该可以处理复活。
5.处理终结的指南是什么?
答:若要避免由.NETFramework对终结代码调用的不确定顺序导致的问题,
除了细心设计之外,必须使用显式资源管理。
尽可能的避免终结,应该只在需要终结的类上实现终结,或实现C#中的析构
函数。如果类只有托管引用并且不必管理非内存资源,就不应该执行终结代码。终
结增加了开销和复杂度,并延迟了对象的内存资源的回收。
6.描述在.NETFramework自动内存管理中解决的两种常见的手动内存管理的问题。
答:释放内存失败(内存泄漏)
访问无效内存(不确定的指针引用)
7.描述用于提供隐式资源管理的.NETFramework技术。
答:在垃圾回收的终止阶段,垃圾回收调用终止代码(C#析构函数),它允
许对象在它的内存资源被释放前,正确地清除它的资源。
8.说明为什么显式资源管理是理想的。描述类应该继承的接口和类应该实现的方法来提供
显式资源管理。
答:隐式资源管理是非确定性的,因此一个应用程序不能知道释放资源的确切
时间。显式资源管理允许用户调用一个方法来确定性地释放资源。因此,类应该继
承(disposable并实现它的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.指出至少_£种.NETFramework流以及它们之间的区别。
答:FileStream对文件进行读取和写入。
Memorystream对内存进行读取和写入。
BufferedStream用于对另外一个流进行缓冲读取和写入。
Networkstream为网络访问提供数据的基础流
5.指出三种基本的流操作。
答:读取、写入和查找。
6.指出用于以二进制值形式读写基元类型的类。
答:BinaryReader和BivaryWriter。
7.指出用于提供对文件随机访问的方法。
答:Seeko
8.指出用于监视文件系统变化的类。
答:FileSystemWatchero
9.为什么使用独立存储?
答:独立存储是一种数据存储机制,通过在代码和保存的数据之间定义了标准
化的关联方式,从而提供隔离性和安全性。
当应用程序在文件中存储数据时,必须小心选择文件名和存储位置,最大程度
地减小其他应用程序知道该存储位置的可能性。因此,使数据不易受到损坏。独立
存储提供了管理下载Web应用程序文件来最大程度地减小存储冲突的手段。
通过独立存储,代码不再需要使用唯一路径来指定文件系统中的安全位置,就
可以保护数据以防止未授权的访问。不再需要指示应用程序的存储区域位置的硬代
码信息。通过独立存储,可以使部分受信任的应用程序以由计算机安全策略控制的
方式存储数据。
10.指出.NETFramework的独立存储提供给应用程序的两个重要特性。
答:隔离和安全。
11.文件和流的主要区别是什么?
答:文件通常表示持久化保存在磁盘上的字符序列,它具有名称和路径;
而流是一个字符序列的抽象表示,它提供了一个向后备存储区(如磁盘或内存)
中读取和写入字节的方法。所有表示流的类都继承自Stream类。Stream类和它
的子类提供了对数据源和储存库的种类视图,并将程序员与操作系统和底层设备的
具体细节隔离开。
第H章Internet访问
习题答案
1.下面哪个不是.NETFramework中网络流的功能?
a)发送和接收Web数据的普通方式。
b)和.NETFramework中流的兼容性。
c)流用于整个.NETFramework,它提供了丰富的基础结构来处理流。
d)流强制应用程序等待整个数据集下我完成才处理数据。
答:d
2.下面哪个功能在Internet应用程序上不为发送和接收数据提供安全性?
a)直接使用套接字
b)通过使用Web代理
c)Internet身份验证
d).NETFramework的代码访问权限
答:a
3.下面哪个不是URI的组成部分?
a)方案标识符
b)客户机标识符
c)路径标识符
d)可选的查询字符串,将信息从客户端传递到服务器。
答:b
4.下面哪个许可控制应用程序在本地端口接受data的权利?
a)Web许可(WebPermission)
b)应用程序许可
c)管套许可(SocketPermission)
d)安全许可(SecurityPermission)。
答:C
5.指出URI的四个组成部分:/default.htm?foo=bar
答:方案标识符http
服务器标识符www.M
路径标识符/default.htm
查询字符串?foo=bar
6.写一行代码,创建一个到问题1中的URI的WebRequest«
答:
WebRequestreq=WebRequest.Create("/Default.ht-
m?foo=bar");
7.写一行代码来从练习2中的WebRequest得到一个WebResponse。
答:
WebResponseresp=req.GetResponse();
8.写一行代码来从练习3中的WebResponse得到一个Stream。
答:
Streamrespstrm=resp.GetResponseStream();
9.指出由GetResponse方法引发的Web特定类型的异常。
答:WebException
10.说明如何用WebRequest来使用安全套接字层协议。
答:URI以https开头。
11.指出至少三种.NETFramework.支持的身份认证方法。
答:基本身份验证
摘要式身份验证
协商身份验证
NTLM
Kerberos
12.如何更加有效地使用包含System.Net命名空间中的类?
答:尽可能地使用WebRequest和WebResponse,而不是强制类型转换到
派生类。
当编写运行在使用System.Net命名空间中的类的服务器上的ASP.NET应用
程序时,从性能的观点,对GetResponse和GetResponseStream使用异步方法
通常较好。
在ServicePoint实例中为应用程序设置ConnectionLimit属性。到Internet资
源的连接数对网络的性能和吞吐量有意义重大的效果。默认情况下,System.Net
对每个主机的每个应用程序使用两个连接。通过在ServicePoint实例中为应用程
序设置ConnectionLimit属性可以增加连接数的值。
当写套接字层协议时,尝试使用TcpCIient或UdpCIient类,而不是直接写
套接字。TcpCIient和UdpCIient类封装了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]publicclassFoo{intFl;
[NonSerialized]intF2);
7.说出.NETFramework提供的两种类型的格式化程序的名字,并描述功能。
答:为简洁的二进制格式提供的BinaryFormatter
为XML表示提供的SoapFormatter
8.描述如何使一个类实现自定义的序列化。
答:类应该继承自Iserializable接口、实现接口的GetObjectData方法、并提
供一个带Serializationinfo和Streamingcontext参数的构造函数
9.哪种数据通常不能被客户访问,但可以通过序列化来使它对于客户可见?
答:私有对象状态
第13章远程处理和XMLWebService
习题答案:
1.NETFrameworkremoting服务架构的构成?
答:可替换的通讯信道(channel)负责在本地和远程应用程序之间传输消息;
格式器(formatter)在通过信道传输消息之前对其进行编码和解码:
代理(proxy)把远程方法调用转发给合适的对象;
远程对象的激活(activation)和生存期支持。
2.信道选择受什么规则支配?
答:注册对象前必须已经注册信道。在可以调用远程对象之前,至少有一个信
道必须用远程处理基础结构注册。
基于每个应用程序域(AppDomain)来注册信道。单个进程中可能包含多个应用
程序域。如果某进程死亡,则它注册的所有信道都自动被销毁。
注册一个信道来侦听另一个信道正在侦听的相同端口是无效的。虽然信道基于
每个应用程序域(AppDomain)进行注册,同一台计算机上的不同应用程序域也不能
注册侦听相同端口的同一信道。
3.说明租约机制的用途和潜在缺点。
答:使用租约机制,可以控制客户端激活的远程对象的生存期。当对象第一次
被创建时,就给定一个租约时间。当对象的租约时间到达零时,对象就与远程基础
结构断开连接。在对象的应用程序域中的对象引用都被释放后,该对象可能在下一
次垃圾回收发生时被收集。
使用租约管理远程对象的生存期是作为引用计数的一种替代,引用计数在不可
靠的网络连接中倾向于比较复杂且低效。
租约的一个潜在缺点是远程对象的生存期被延伸的时间可能超过所需要的。然
而,减少了专用于引用计数和客户端进行ping操作的网络通信量的优点超过了远
程对象延长生存期的缺点。
4.通用描述、发现和集成项目的用途是什么?
答:通用描述、发现和集成(UDDI)项目是一个跨行业的项目,它致力于创
建一个独立于平台的开放框架,用于描述Web服务、发现业务以及集成使用
Internet的业务服务。这个项目由所有的主要平台和软件提供商、市场经营者和电
子商务领导者的驱动。
UDDI站点本身就是Web服务。它们公布一对基于SOAP的API:inquiryAPI
用于查询公司和公司的Web服务,而publisherAPI用于广告某公司的Web服务。
任何人都可以调用inquiryAPI,但运行站点典型地限制发行人API给已注册成员。
5.同一计算机上的两个应用程序域都有一个信道,这两个信道能否侦听相同的端口号?
答:端口是机器范围内资源。因此,在同一计算
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年一级注册建筑师全真模拟测试带答案
- 2025年甘肃省临夏回族自治州单招职业适应性测试题库及完整答案
- 护理相关知识课件
- 冷媒回收充注机使用方法介绍汽车空调系统维修课堂课件
- 游戏技术:革新与未来
- 2025年湖北省宜昌市单招职业适应性测试题库及完整答案1套
- 《用计算机娱乐》信息技术课程教学设计
- 辽宁省锦州市2024-2025学年八年级上学期10月月考数学试卷(含答案)
- 医疗变革:数字化之路
- 饮食均衡之道
- 检测站登录员试题及答案
- 委托选矿加工合同协议
- 食堂应急预案管理制度
- CISP-PTE培训课件教学课件
- 2025年新高考历史预测模拟试卷黑吉辽蒙卷(含答案解析)
- 2025年医院文化节活动策划
- 部队防雷电暴雨安全知识
- 2025年消防文员类面试题及答案
- 重庆市名校联盟2024-2025学年高二上学期第一次联合考试物理试题(解析版)
- 船舶驾驶培训虚拟场景构建-深度研究
- 手术患者预防跌倒
评论
0/150
提交评论