C#编程基础练习题与答案2.pdf

上传人:无*** 文档编号:90892305 上传时间:2023-05-18 格式:PDF 页数:63 大小:6.36MB
返回 下载 相关 举报
C#编程基础练习题与答案2.pdf_第1页
第1页 / 共63页
C#编程基础练习题与答案2.pdf_第2页
第2页 / 共63页
点击查看更多>>
资源描述

《C#编程基础练习题与答案2.pdf》由会员分享,可在线阅读,更多相关《C#编程基础练习题与答案2.pdf(63页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、1.面向对象的思想主要包括什么?答:个人认为一各程序语言要成为真正的面向对象的程序设计语言,它必须符合下列条件:1 抽象(a b s t r a c t io n)抽象能够有效地管理一个问题的复杂性,其作法是划分出与该问题相关的一组对象.2 封装(E n c a p s u l a t io n)一封装是指将一个抽象的内部实现隐藏在特定的对象之内.3 多态(p o l ym o r p his m)一多态会提供相同方法的多种操作方法的多种操作实作.例如,不同的对象都会拥有一个S a v e方法,但是每一个S a v e方法会执行不同的操作.4 继承(in her it a n c e)Vis

2、u a l C#2005最令人兴奋之处就是其继承特性.v c#2005则提供了真正的方法继承,因此您可以重复使用个类的实例.2.什么是A S P.n et 中的用户控件自己动手作自己的控件来取代.N E T提供的控件。这种控件就是用户控件。后缀为.ascx3.什么叫应用程序域?什么是受管制的代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?什么是多态?C TS、C L S 和 C L R 分别作何解释?应用程序域:应用程序域(通常是A p p D o m a in)是用于隔离应用程序的虚拟进程。在同一个应用程序作用域中创建的所有对象(换句话说,从该应用程序的入口点开始沿着对象激活序列的任何

3、地方)都在同一个应用程序域中创建。多个应用程序域可以存在于一个操作系统进程中,使它们成为隔离应用程序的简便方式。操作系统进程通过使用各不相同的内存地址空间来提供隔离。尽管它是有效的,但也是代价昂贵的,并且不能达到大型W e b服务器所需要的数量。与其相比,公共语言运行时通过管理在应用程序域中运行的代码的内存使用来强制进行应用程序隔离。这样就确保它不会访问应用程序域以外的内存。需要注意的是,只有类型安全的代码才能以这种方式管理(当在应用程序域中加载不安全代码时,运行时不能保 证 隔 离。理解应用程序域:应用程序域是.N E T 运行库的逻辑进程表示,操作系统进程可以包含多个应用程序域。应用程序域

4、具有下列优点:1、隐藏了进程具体的操作系统信息。从而允许把.N E T 放在不同的操作系统下。2、提供了隔离。即使运行在同一个进程中的属于不同域的应用程序也不能直接共享全局数据、静态数据或其他资源。所以,一个应用程序域失败了,也不会影响到同一个进程中的其他应用程序域。3、对于不需要昂贵的I P C 机制的进程,应用程序域允许.N E T 运行库优化运行在这种进程中的应用程序间的通信。因为应用程序域是被隔离的,所有.N E T 对象都会被界定在创建它的应用程序域内。如果跨应用程序域的边界传递对象引用,该被引用对象就被称为远程对象。装箱和拆箱在C#中的有两种类型的变量:值类型和引用类型。当值类型和

5、引用类型相互转化时,会发生装箱和拆箱的过程。这里有一点耍声明:经过拆箱或装箱的对象会多出它自己一份拷贝。它和它的拷贝不在一个存储区域。这也是值类型和引用类型的区别所在。值类型总是在栈中,而引用类型总是在托管堆中。(目前J 2 S E 5.0 也支持了装箱和拆箱,但是我目前不知道是否和C#一样)。为了进一步理解看下面例子:s t r uc t P oi n t p ub l i c i n t x;p ub l i c i n t y;)s t a t i c voi d M a i n O P oi n t p;p.x=1 0;p.y=2 0;O b j e c t o=p;/b ox.将值类

6、型从栈中拷贝到堆中。*从托管堆中将对象拷贝到栈中。P oi n t p 2=(P oi n t)p;C on s ol e.W r i t e L i n e (4 tp 2.x:=+p 2.x+“p 2.y:=+p 2.x);p.x=1 6;p.y=3 4;C on s ol e.W r i t e L i n e (up 2.x:=,+p 2.x+“p 2.y:=+p 2.x);C on s ol e.W r i t e L i n e (up.x:=+p.x+“p.y:=4+p.x);输出结果为:p 2.x:=1 0;p 2.y=2 0;p 2.x:=1 0;p 2.y=2 0;p.x:

7、=1 6;p.y=3 4;可知,变量经过拆箱/装箱后,得到是自己的另一份拷贝。装箱和取消装箱的概念是 C#的类型系统的核心。它在“值类型”和“引用类型”之间的架起了一座桥梁,使得任何“值类型”的值都可以转换为 ob j ect 类型的值,反过来转换也可以。装箱和取消装箱使我们能够统一地来考察类型系统,其中任何类型的值最终都可以按对象处理多态形象理解两条理解的原则:(1)一个派生类对象可以被声明成一个基类,或者是一个基类指针可以指向一个派生类对象:/c+codeB as eC l as s *p;D er i v edC l as s ob j;P=&ob j;C#codeB as eC l a

8、s s ob j =n ew D er i v edC l as s();(2)把一个对象看做是一个独立的个体,调用对象的p u b l i c成员函数实际上是给这个对象发送一个消息,采取什么样的动作完全由对象自己决定。Sh ap e是基类,C i r cl e和L i n e是从Sh ap e继承出来的,Sh ap e有dr aw。方法,C i r cl e与L i n e分别自己定义了自己的dr aw。方法,在下面的代码里:/J av a C odes t at i c v oi d fu n c(Sh ap e s)(s.D r aw ();如果发生了这样的调用:L i n e 1 =n

9、 ew L i n e();C i r cl e c=n ew C i r cl eO ;fu n c ;fu n c(c);一个C i r cl e和一个L i n e被当做Sh ap e传到函数里去了,然后调用D r aw。,会发生什么情况?因为对象是独立的个体,在fu n c()里,这两个对象被分别传递了D r aw。消息,叫它们绘制自己吧,于是他们分别调用了自己类里定义的D r aw。动作。通过这两条原则我们可以理解上面的多态。正是由于多态,使得我们不必要这样去做:I F 你是一个C i r cl e TH E N 调用C i r cl e的D r aw。E L SE I F 你是一个

10、L i n e TH E N 调用L i n e的D r aw。E L SE 我们只要给这个被声明成为Sh ap e的对象发送D r aw 消息,怎么样去D r aw 就由对象自己去决定了。二.一 切皆因虚函数先看看实现多态的基本条件:(1)基类含有虚函数(2)继承类把这个虚函数重新实现了(3)继承类也可能没有重新实现基类的所有虚函数,因此对于这些没有被重新实现的虚函数不能发生多态。再看一下几种语言里一些特别的规定:1.C+:(1)虚函数用v i r t u al 关键字声明。(2)v i r t u al v oi d F u n c(p ar ai s t)=0;这样的虚函数叫做纯虚函数,

11、表示这个函数没有具体实现。包含纯虚函数的类叫做抽象类,如果他的继承类没有对这个纯虚函数具体用代码实现,则这个继承类也是抽象类。抽象类不能被实例话(就是说不能创建出对象)。(3)继承类重新实现基类的虚函数时,不需要做任何特别的声明。(4)如果不用v i r t u al 关键字修饰,并且在派生类里重新实现了这个方法,这仅仅是一个简单的覆盖,不会发生多态,我们暂称它非多态吧。2.J av a:(1)J av a没有v i r t u al 关键字,J av a把一切类的方法都认为是虚函数。(2)继承类重新实现基类的虚函数时,不需要做任何特别的声明。因此在Ja v a 里只要重新实现了基类的方法,并

12、且把继承类对象声明为基类,多态就要发生。因此Ja v a 对多态的条件相对是比较低的。/Ja v a Codec l a s s Ba s e Cl a s s(pu b l i c v oi d h e l l o();c l a s s De r i v e dCl a s s e x t e n ds Ba s e Cl a s s(pu b l i c v oi d h e l l o()(Sy s t e m,ou t.pr i n t l n(*He l l o w or l d!);pu b l i c s t a t i c v oi d m a i n(St r i n g

13、a r g s)(Ba s e Cl a s s ob j =n e w De r i v e dCl a s s();ob j.h e l l oO;)输入是He l l o w or l d!。这样就实现了多态。(3)虚函数用a b s t r a c t 声明,含有虚函数的类是抽象类,也要用a b s t r a c t 关键字修饰。/Ja v a Codepu b l i c a b s t r a c t Ab s t r a c t c l a s spu b l i c a b s t r a c t v oi d h e l l o();/-3.C#:C#对于多态的编写是最为严

14、格和严谨的。(1)虚函数用v i r t u a l 声明。(2)纯虚函数用a b s t r a c t 声明,含纯虚函数的类是抽象类,必须用a b s t r a c t 关键字修饰。(3)如果仅仅是覆盖基类的非虚方法,则需要用n e w 关键字声明:/C#Codepu b l i c c l a s s Ba s e Cl a s s(pu b l i c v oi d h e l l o()(Sy s t e m.Con s ol e.Wr i t e Li n e (He l l o,t h i s c om e f r om Ba s e Cl a s s);)pu b l i c

15、 c l a s s De r i v e dCl a s s :Ba s e Cl a s s(pu b l i c n e w v oi d h e l l o()(Sy s t e m.Con s ol e.Wr i t e Li n e(*He l l o,t h i s i s c om e f r om De r i v e dCl a s s);)pu b l i c s t a t i c v oi d Ma i n()(Ba s e Cl a s s ob j =n e w De r i v e dCl a s s();ob j.h e l l oO;)输出为He l l o

16、,t h i s c om e f r om Ba s e Cl a s s,也就是说这并没有实现多态(非多态)。(4)通过v i r t u a l -ov e r r i de、a b s t r a c t -ov e r r i de 组合实现多态。当派生类重新实现基类的虚函数(或纯虚函数)时,必须用ov e r r i de 关键字进行修饰。/C#Codepu b l i c a b s t r a c t c l a s s Ab s Ba s e Cl a s s(pu b l i c a b s t r a c t v oi d h e l l oO;)pu b l i c c

17、 l a s s De r i v e dCl a s s :Ab s Ba s e Cl a s spu b l i c v oi d h e l l oOSy s t e m.Con s ol e.Wr i t e Li n e(He l l o w or l d!);pu b l i c s t a t i c v oi d Sa y He l l o(Ab s Ba s e Cl a s s ob j)(ob j.h e l i oO;)pu b l i c s t a t i c v oi d Ma i n()(De r i v e dCl a s s _ob j =n e w De

18、 r i v e dCl a s s();De r i v e dCl a s s.Sa y He l l o(_ob j);)输出为He l l o w or l d!三.多态的反溯继承类对象在发生多态时,并是不完全抛开基类不管的,它会去查看基类的虚函数列表,在这个列表的范围内才会发生多态。让我们来看一个比较复杂的例子:/Ja v a Codec l a s s Apr ot e c t e d v oi d h e l l o(Ob j e c t o)(Sy s t e m,ou t.pr i n t i n (,ZA-Ob j e c t);)c l a s s B e x t e n

19、 ds A(pr ot e c t e d v oi d h e l l o(St r i n g s)(Sy s t e m,ou t.pr i n t i n (Z/B-St r i n g);pr ot e c t e d v oi d h e l l o(Ob j e c t o)Sy s t e m,ou t.pr i n t i n(B-Ob j e c t););c l a s s Cpu b l i c s t a t i c v oi d m a i n(St r i n g a r g s)Ob j e c t ob j =n e w Ob j e c t ();St r

20、i n g s t r =ABC;A a =n e w B();a.h e l l o(ob j);a.h e l l o(s t r);;输出结果为:B-Ob j e c tB-Ob j e c t正如上面所说的,由于基类里没有参数类型为St r i n g的虚函数,因此B的h e l l o(St r i n g)方法不参与多态。调用a.h e l l o(s t r)时,由于St r i n g是Ob j e c t的继承类,因此这个s t r被作为一个Ob j e c t传入了B的h e l l o(Ob j e c t),这一点正如我们的原则一所述。四.接口仅仅是更抽象的抽象类接口是

21、类的协定,但由于接口又参与多态性,从这一点说,我们认为它是更为抽象的抽象类:CTS、CLS和CLR.NET结合Ja v a和COM解决方案两者优点来解决互操作性问题。类似于COM定义的标准二进制格式,.NET定义了一个称为通用类型系统Com m on Ty pe Sy s t e m(CTS)的类型标准。这个类型系统不但实现了COM的变量兼容类型,而且还定义了通过用户自定义类型的方式来进行类型扩展。任何以.NET平台作为目标的语言必须建立它的数据类型与C T S的类型间的映射。所有.N E T语言共享这一类型系统,实现它们之间无缝的互操作。该方案还提供了语言之间的继承性。例如,用户能够在V B

22、.N E T中派生一个由C#编写的类。很显然,编程语言的区别不仅仅在于类型。例如,一些语言支持多继承性,一些语言支持无符号数据类型,一些语言支持运算符重载。用户应认识到这一点,因此.N E T通过定义公共语言规范(C L S:C ommon L a ngu a ge S pe cifica t ion),限制了由这些不同引发的互操作性问题。C L S制定了-种以.N E T平台为目标的语言所必须支持的最小特征,以及该语言与其他.N E T语言之间实现互操作性所需要的完备特征。认识到这点很重要,这里讨论的特征问题已不仅仅是语言间的简单语法区别。例如,C L S并不去关心一种语言用什么关键字实现继

23、承,只是关心该语言如何支持继承。C L S 是C T S 的一个子集。这就意味着一种语言特征可能符合C T S 标准,但又超出C L S 的范畴。例如:C#支持无符号数字类型,该特征能通过C T S 的测试,但C L S 却仅仅识别符号数字类型。因此,如果用户在一个组件中使用C#的无符号类型,就可能不能与不使用无符号类型的语言(如V B.N E T)设计的.N E T 组件实现互操作。这里用的是“可能不”,而不是“不可能”,因为这一问题实际依赖于对non-C L S-complia nt 项的可见性。事实上,C L S 规则只适用于或部分适用于那些与其他组件存在联系的组件中的类型。实际上,用户

24、能够安全实现含私有组件的项目,而该组件使用了用户所选择使用的.N E T 语言的全部功能,且无需遵守C L S 的规范。另 方面,如果用户需要.N E T 语言的互操作性,那么用户的组件中的公共项必须完全符合C L S 规范。让我们来看下面的C#代码:pu b lic cla ss F oo(/T he u int(u nsigne d int e ge r)t y pe is non-C L S complia nt./B u t since t his it e m is priv a t e,t he C L S ru le s do not a pply,priv a t e u in

25、t A =4;/S ince shis u int me mb e r is pu b lic,w e ha v e a C L S/complia nce issu e.pu b lic u int B =5;/T he long t y pe is C L S complia nt.pu b lic long G e t A ()(re t u rn A;)最后一个C 是公共语言运行库C ommon L a ngu a ge R u nt ime (C L R)(,简单地说,C L R 是C T S 的实现,也就是说,C L R 是应用程序的执行引擎和功能齐全的类库,该类库严格按照C T

26、S 规范实现。作为程序执行引擎,C L R 负责安全地载入和运行用户程序代码,包括对不用对象的垃圾回收和安全检查。在C L R 监控之下运行的代码,称为托管代码(ma na g e d c o de)作为类库,C L R 提供上百个可用的有用类型,而这些类型可通过继承进行扩展。对于文件I/O、创建对话框、启动线程等类型基本上能使用W indo w s A P I 来完成的操作,都可由其完成。让我们正确看待“3 C”.开发人员在构建自己的分布式应用程序时,因为用户在编程时将直接面对C L R,应将主要精力放在学习了解C L R 上,而不是C T S 和C L S。而对于希望以.N E T 平台为

27、目标的语言和工具开发商来说,就需要深入理解C T S 和C L S。互操作性组件是分布式应用的关键,因此理解.N E T 如何通过定义公共类型实现这一目标,也就显得十分重要。4.列举一下你所了解的XM L 技术及其应用5.值类型和引用类型的区别?写出C#的样例代码R e f 与 O u t 的区别。R e f 与 O u t 的区别是相同点:L使参数按引用传递,注意这里的“引用”与我们通常说的“对象引用 不一样,可以形象的理解为,类似于C/C+中传指针(地址)。2 .效果是,被调用方对该参数的修改会反映到该变量中,即当调用结束返回时,调用方看到的是修改过的值。3 .方法定义和调用方法都必须显式

28、使用r e f 或 者 o u t 关键字不同点:1=传递到r e f 的参数必须最先初始化,即由调用方显式初始化。2。传递到o u t 的参数在传递之前不需要显式初始化,但需要调用方在方法返回之前必须对其赋值。使用场景:关于重载说明:1 r e f 和 o u t 关键字在运行时的处理方式不同,但在编译时的处理方式相同。因此,如果一个方法采用r e f 参数,而另一个方法采用o u t 参数,则无法重载这两个方法。2。但是,如果一个方法采用r e f 或 o u t 参数,而另一个方法不采用这两类参数,则可以进行重载。使用r e f 前必须对变量赋值,o u t 不用。o u t 的函数会清

29、空变量,即使变量已经赋值也不行,退出函数时所有。u t 引用的变量都要赋值,r e f引用的可以修改,也可以不修改。区别可以参看下面的代码:u s i n g S y s t e m;c l a s s T e s t A p p(s t a t i c v o i d o u t T e s t(o u t i n t x,o u t i n t y)离开这个函数前,必须对x 和y 赋值,否则会报错。/y =x;上面这行会报错,因为使用了。u t 后,x 和y 都清空了,需要重新赋值,即使调用函数前赋过值也不行x =1;y =2;)s t a t i c v o i d r e f T e

30、s t(r e f i n t x,r e f i n t y)X =1;y =x;)p u b l i c s t a t i c v o i d Ma i n()(/o u t t e s ti n t a,b;o u t使用前,变量可以不赋值o u t T e s t (o u t a,o u t b);C o n s o l e.W r i t e L i n e(,za=0;b=l a,b);i n t c=l l,d=2 2;o u t T e s t(o u t c,o u t d);C o n s o l e.W r i t e L i n e(/zc=0;d=l/z,c,d)

31、;/r e f t e s ti n t m,n;/r e f T e s t(r e f m,r e f n);上面这行会出错,r e f使用前,变量必须赋值i n t o=l l,p=2 2;r e f T e s t(r e f o,r e f p);C o n s o l e.W r i t e L i n e(o=0;p=1”,o,p);)6 .A D 0.n e t中常用的对象有哪些?分别描述一下。C o n n e c t i o n 对象C o m m a n d 与 D a t a R e a d e r 对象D a t a S e t 与 D a t a A d a p t

32、 e r7 .如何理解委托?单从委托的概念上来讲怨简单,就是对方法的引用,包括静态方法和对象实例的方法,有点类似C语言中的方法指针,不过方法指针只能引用静态方法!而且委托是类安全的!一句话来概括:委托就是方法的入口!调用委托就是调用方法,可能有人会说既然调用委托就是调用方法,那为什么不直接调用方法了,干吗非得通过委托来调用!一开始我也是这么想,包括现在也还有这个疑惑,个人觉得,如果撇开事件来说,委托除了匿名方法名称之外,没有具体实质型的好处!意思就是说我们如果不是在事件里用委托,和直接调用方法是没有本质区别的!至于委托的声明格式,其基本语法为:修 饰 符delegate返回类型代理名称(参数列

33、表)比如说 public delegate void My Delegate(int i);实例化的时候给它赋值一个方法(实例或静态方法)名就可以了 MyDelegate MD=newMyDelegate(类中的方法名)委托还可以实现多重委托,可以用Combine方法讲不同代理组在一起,也可以用Remove方法从多重代理中除去一个代理,不过在我们实际使用可以不需要这么麻烦,用+,-可以达到这个目的!比如说:MyDelegate MD=new MyDelegate(方法 1);MyDelegate MD2=new MyDelegate(方法2);MyDelegate MD3=MD+MD2;也可以

34、这么写MyDelegate MD3+=new MyDelegate(方法 1);MyDelegate MD3+=new MyDelegate(方法2);执行代理MD3就是调用方法1和方法2;多重代理个人觉得在事件委托中用处很大,因为在实际对象中,一个方法执行会触发多个方法相继执行,这个时候会需要多重代理这个概念!使用多重代理的时候要注意方法返回类型必须是void类型的!PS:在代理类中有2个属性,一个是Method,表示所应用方法的名称!另一个是Target,表示实例方法所在对象的类型,如果是静态方法,则返回NULL事件(Event)正如我上面说的那样,如果撇开事件,委托好像没有多大用途,但也

35、只是假设,委托就是为事件服务的,两者是分不开的.言事件比言委托!在C#中,事件和属性,方法一样,是类的种成员,通过事件的使用,可以在类的对象发生某种变化,通过事件,来触发某些方法来处理事件的发生!举个通俗的例子,在ASP.NET的窗体生成种,拖进来一个按钮,双击它,页面后台会自动生成按钮事件的方法名称,编程人员只要在该方法体内写上具体方法即可!那么按钮类里面是怎么实现的了?具体是这样的,在按钮类里面声明了一个事件委托:public envet EventHandler Click;并写了一个触发该事件的方法:protected virtual void OnClick(EventArges e

36、)i f(C l i c k!=N u l l)C l i c k(t h i s,e)而什么时候调用上面这个方法,根据程序结构类型不同而异,在WEB应用程序中,是通过回传事件接口来调用上面这个方法,在按钮类里只是实现了事件委托,具体双击按钮触发的实际方法是在页面程序里编写的!(P S:所以这也是我认为使用事件委托的最大好处,机动行好,灵活,如果不用委托,而是直接调用方法,那么所调用的方法就固定死了,不利于实际面向对象编程中出现的未预型方法,不灵活了)在页面程序为按钮绑定事件委托所引用的方法是开发环境自动帮我们完成的,但我们要清楚实现的必要步骤:在页面程序里必须给按钮的事件实例化方法,在A S

37、 P.N E T的页面代码中的p r i v a t e v o i dI n i t i a l i z e C o m p o n e n t O 里要写上:t h i s.B u t t o n 1.C l i c k +=n e w S y s t e m.E v e n t H a n d l e r(t h i s.B u t t o n l _ C l i c k);这里t h i s.B u t t o n l _ C l i c k指具体执行的方法名称然后就可以在t h i s.B u t t o n l _ C l i c k方法里写上具体要执行的代码!综上所述,实现事件的

38、步骤为:1.声明事件委托;2.触发事件的方法;3.实例化事件委托(给委托添加引用方法)m s d n 2 0 0 5中是这样解释的:委托具有以下特点:委 托 类 似 于C+函数指针,但它是类型安全的。委托允许将方法作为参数进行传递。委托可用于定义回调方法.委托可以链接在一起;例如,可以对一个事件调用多个方法。方法不需要与委托签名精确匹配。有关更多信息,请参见协变和逆变。C#2.0版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独定义的方法。委托适用于那种在某些其他语言中需用函数指针来解决的情况(场合)。但是,与函数指针不同,委托是面向对象和类型安全的。委托声明定义一个类,它是

39、从 S y s t e m.D e l e g a t e 类派生的类。委托实例封装了一个调用列表,该列表列出了一个或多个方法,每个方法称为一个可调用实体。对于实例方法,可调用实体由一个实例和该实例的方法组成。对于静态方法,可调用实体仅由一个方法组成。如果用一组合适的参数来调用一个委托实例,则该委托实例所封装的每个可调用实体都会被调用,并且用的都是上述的同一组参数。委托实例的一个有趣且有用的属性是:它既不知道也不关心有关它所封装的方法所属的类的种种详情;对它来说最重要的是这些方法与该委托的类型兼容(笫 1 5.1 节)。这使委托非常适合“匿名”调用。这是一个强大的功能。定义和使用委托分三个步骤

40、:声明、实例化和调用。8.C#中的接口和类有什么异同。一个接口定义一个协定。实现接口的类或结构必须遵守其协定。接口可以包含方法、属性、索引器和事件作为成员。接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念!而类是负责功能的具体实现!在类中也有抽象类的定义,抽象类与接口的区别在于:抽象类是一个不完全的类,类里面有抽象的方法,属性,也可以有具体的方法和属性,需要进一步的专业化。但接口是一个行为的规范,里面的所有东西都是抽象的!一个类只可以继承一个基类也就是父类,但可以实现多个接口P S:接口除了规范一个行为之外,在具体项目中的实际作用也是十分重要的,在面向对象的设计原则以及设计

41、模式的使用中,无不体现作为一个接口的使用好处,最直接的就是设计原则中O C P(开放封闭原则),我们使用接口,而不需要关心他的具体实现,具体实现的细节变化也无关客户 端(使用接口的类)的使用,对与扩展是开放的,我们可以另写一个接口的实现来扩展当前程序,而不影响上层的使用,但对修改是封闭的,即我们不能够再去修改接口的定义,当然这个“不能够”是指在规范原则上不应该这么做!9.n e t中读写数据库需要用到哪些类?他们的作用1 0.U D P连接和T C P连接的异同。1 1.A S P.n e t的身份验证方式有哪些?分别是什么原理?1 2.进程和线程分别怎么理解?简单的说,你每启动一个程序,就启

42、动了一个进程。在W i n d o w s 3.x下,进程是最小运行单位。在W i n d o w s 9 5/N T下,每个进程还可以启动几个线程,比如每下载一个文件可以单独开一个线程。在W i n d o w s 9 5/N T下,线程是最小单位。W I N D O W S的多任务特性使得线程之间独立运行,但是它们彼此共享虚拟空间,也就是共用变量,线程有可能会同时操作一片内存。线程与进程的区别多线程共存于应用程序中是现代操作系统中的基本特征和重要标志。用过UNIX操作系统的读者知道进程,在 UNIX操作系统中,每个应用程序的执行都在操作系统内核中登记一个进程标志,操作系统根据分配的标志对应

43、用程序的执行进行调度和系统资源分配,但进程和线程有什么区别呢?进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:线程的划分尺度小于进程,使得多线程程序的并发性搞。另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口13.什么是code-Behind技术。14.活动目录的作用。15.n e t中读写XML的类都归属于哪些命名空间?16.解释一下UDDI、WSDL的意义及其作用。17.什么是SOA

44、P,有哪些应用。答:SOAP(Simple Object Access Protocol)简单对象访问协议是在分散或分布式的环境中交换信息并执行远程过程调用的协议,是一个基于XML的协议。使用SO A P,不用考虑任何特定的传输协议(最常用的还是HTTP协议),可以允许任何类型的对象或代码,在任何平台上,以任何一直语言相互通信。这种相互通信采用的是XML格式的消息,具体请看 18.如何部署一个ASP.n e t页面。19.如何理解.n e t中的垃圾回收机制。20.常用的调用webservice方法有哪些?21.Virtual 与 abstraction 区别?22.结构与类有何差异?哪些时候

45、比较适合使用结构和类?它们的相同之处:1,两者都是C o n t a i n e r 类型,这表示它们可以包含其他数据类型作为成员.2,两者都拥有成员,这些成员包括:构造函数,方法,属性,字段,常量,枚举类型,事件,以及事件处理函数.3,两者的成员都有其各自的存取范围.例如,您可以将某一个成员声明为P u b l i c,而将另外一人成员声明为P r i v a t e4,两者都可以实现接口.5,两者都可以公开一个默认属性,然而前提是这个属性至少要取得一个自变量.6,两者都可以声明和触发事件,而且两者都可以声明委托(De l e g a te).7,结构与类都可以完全是空的.它们的不同之处如下

46、:1,结构是实值类型(V a l u e Ty p e s),而类是引用类型(Re fe r e n c e Ty p e s).2,结构使用载存储(S ta c k Al l oc a ti on),而类使用堆存储(He a p Al l oc a ti on).3,所有结构成员默认都是Pu bl i c,而类的变量与常量数则默认为(Pr i v a te,不过其他类成员默认都是Pu bl i c.4,结构成员国不能被声明为Pr ote c te d,但是类成员可以这样做.5,结构变量声明不能指定初始值,使用n e w 关键字词或对数组进行初始化,但类变量声明则可以这样做.6,结构不能声明默

47、认的构造函数,也就是不拥有参数的非共享构造函数,但是类则无此限制.7,二者都可以拥有共享构造函数,结构的共享构造函数不能带有参数,但类的共享构造函数则可以带或者不带参数.8,结构不允许声明析构函数(De s tr u c tor),类则无此限制.9,结构的实例(In s ta n c e)声明,不允许对包含的变量进行初始化设定,类则可以在声明类的实例时,同时进行变量初始化.1 0,结构是隐式继承自V a l u e Ty p e 类而且不能继承任何其它的类型,类则可以继承来自V a l u e Ty p e 以外的任何类.1 1,结构是无法被继承的,类则可以被继承.1 2,结构永远不会终止,因

48、 此 C om m on L a n g u a g e Ru n ti m e(C L R)不会在任何结构上调用Fi n a l i z e 方法.类则是由内存回收进程加以终止,当内存回收进程检测到没有任何作用的类时,它就会调用类的Fi n a l i z e 方法.1 3,结构不需要构造函数,类则需要构造函数.1 4,结构只能在一种情况下使用非共享构造函数,那就是非共享构造函数会接收参数:但是类则无此限制,它可以使用带参数或不带参数的非共享构造函数.1 5,每一个结构都具有无参数的隐含公共构造函数.此构造函数会将结构的所有成员初始化为基默认值.您不能重新定义这个行为.除了上述的相似处与相异

49、点之外,我们还可以在实例与变量”层面上来探讨结构与类.由于结构是数值类型的,因此每个结构变量会永久地绑定到结构实例上.然而类是引用类型的,而且对象变量可引用不同的类实例.在此方面的区别,会对于使用结构与类造成下列影响:1结构变量会隐式地使用结构的无参数构造函数来初始化成员,这就意味着,语 句Structl S就等于 Structl S=new Structl();2当您好将一个结构变量赋值给另一个,或是将结构实例传递到程序变量时,所有变量成员的值会复制到新的结构中.当您将一个对象变量赋值给另一个,或是将对象变量传递到程序时,则只会复制指针.3,您可以将N ull值赋值给结构变量,但是该实例会一

50、直与该变量保持关联.虽然变量成员会因此赋值而重新初始化,但是您还是可以调用变量的方法并访问其数据成员.相反地,如果您将对象变量设定为Null,您就会中断它与任何类实例的关联,而且除非您再将另外一个实例赋值给它,否则无法通过变量访问任何成员.4,您可以在不同时间将不同的类的实例赋值给同一个对象变量,而且在同一时间可以有好几个对象变量引用相同的类实例,如果您对类成员值做了改变,则其它指向相同实例的对象变量也会发生改变.然而,结构成员则会封装在它们自己的实例中,变更结构成员值并不会对其它任何结构变量的成员造成影响,甚至也不会影响相同Struct声明的其它实例.5,两个结构必须以成员对成员的比较方式来

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁