C编程基础练习题集和答案_第1页
C编程基础练习题集和答案_第2页
C编程基础练习题集和答案_第3页
C编程基础练习题集和答案_第4页
C编程基础练习题集和答案_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

...wd......wd......wd...1.面向对象的思想主要包括什么答:个人认为一各程序语言要成为真正的面向对象的程序设计语言,它必须符合以下条件:1抽象(abstraction)—抽象能够有效地管理一个问题的复杂性,其作法是划分出与该问题相关的一组对象.2封装(Encapsulation)—封装是指将一个抽象的内部实现隐藏在特定的对象之内.3多态(polymorphism)—多态会提供一样方法的多种操作方法的多种操作实作.例如,不同的对象都会拥有一个Save方法,但是每一个Save方法会执行不同的操作.4继承(inheritance)—VisualC#2005最令人兴奋之处就是其继承特性.vc#2005则提供了真正的方法继承,因此您可以重复使用一个类的实例.2.什么是ASP.net中的用户控件自己动手作自己的控件来取代.NET提供的控件。这种控件就是用户控件。后缀为.ascx3.什么叫应用程序域什么是受管制的代码什么是强类型系统什么是装箱和拆箱什么是重载什么是多态?CTS、CLS和CLR分别作何解释应用程序域:应用程序域〔通常是AppDomain〕是用于隔离应用程序的虚拟进程。在同一个应用程序作用域中创立的所有对象〔换句话说,从该应用程序的入口点开场沿着对象激活序列的任何地方〕都在同一个应用程序域中创立。多个应用程序域可以存在于一个操作系统进程中,使它们成为隔离应用程序的简便方式。操作系统进程通过使用各不一样的内存地址空间来提供隔离。尽管它是有效的,但也是代价昂贵的,并且不能到达大型Web服务器所需要的数量。与其相比,公共语言运行时通过管理在应用程序域中运行的代码的内存使用来强制进展应用程序隔离。这样就确保它不会访问应用程序域以外的内存。需要注意的是,只有类型安全的代码才能以这种方式管理〔当在应用程序域中加载不安全代码时,运行时不能保证隔离〕。理解应用程序域:应用程序域是.NET运行库的逻辑进程表示,操作系统进程可以包含多个应用程序域。应用程序域具有以下优点:1、隐藏了进程具体的操作系统信息。从而允许把.NET放在不同的操作系统下。2、提供了隔离。即使运行在同一个进程中的属于不同域的应用程序也不能直接共享全局数据、静态数据或其他资源。所以,一个应用程序域失败了,也不会影响到同一个进程中的其他应用程序域。3、对于不需要昂贵的IPC机制的进程,应用程序域允许.NET运行库优化运行在这种进程中的应用程序间的通信。因为应用程序域是被隔离的,所有.NET对象都会被界定在创立它的应用程序域内。如果跨应用程序域的边界传递对象引用,该被引用对象就被称为远程对象。装箱和拆箱在C#中的有两种类型的变量:值类型和引用类型。当值类型和引用类型相互转化时,会发生装箱和拆箱的过程。这里有一点要声明:经过拆箱或装箱的对象会多出它自己一份拷贝。它和它的拷贝不在一个存储区域。这也是值类型和引用类型的区别所在。值类型总是在栈中,而引用类型总是在托管堆中。〔目前J2SE5.0也支持了装箱和拆箱,但是我目前不知道是否和C#一样〕。为了进一步理解看下面例子:structPoint{publicintx;publicinty;}staticvoidMain(){Pointp;p.x=10;p.y=20;Objecto=p;//box.将值类型从栈中拷贝到堆中。/************************************************************************/*从托管堆中将对象拷贝到栈中。/************************************************************************/Pointp2=(Point)p;Console.WriteLine(“p2.x:="+p2.x+“p2.y:=“+p2.x);p.x=16;p.y=34;Console.WriteLine(“p2.x:="+p2.x+“p2.y:=“+p2.x);Console.WriteLine(“p.x:="+p.x+“p.y:=“+p.x);}输出结果为:p2.x:=10;p2.y=20;p2.x:=10;p2.y=20;p.x:=16;p.y=34;可知,变量经过拆箱/装箱后,得到是自己的另一份拷贝。装箱和取消装箱的概念是C#的类型系统的核心。它在“值类型〞和“引用类型〞之间的架起了一座桥梁,使得任何“值类型〞的值都可以转换为object类型的值,反过来转换也可以。装箱和取消装箱使我们能够统一地来考察类型系统,其中任何类型的值最终都可以按对象处理多态一.形象理解两条理解的原则:〔1〕一个派生类对象可以被声明成一个基类,或者是一个基类指针可以指向一个派生类对象://c++codeBaseClass*p;DerivedClassobj;p=&obj;//C#codeBaseClassobj=newDerivedClass();〔2〕把一个对象看做是一个独立的个体,调用对象的public成员函数实际上是给这个对象发送一个消息,采取什么样的动作完全由对象自己决定。Shape是基类,Circle和Line是从Shape继承出来的,Shape有draw()方法,Circle与Line分别自己定义了自己的draw()方法,在下面的代码里://JavaCodestaticvoidfunc(Shapes){s.Draw();}如果发生了这样的调用:Linel=newLine();Circlec=newCircle();func(l);func(c);一个Circle和一个Line被当做Shape传到函数里去了,然后调用Draw(),会发生什么情况因为对象是独立的个体,在func()里,这两个对象被分别传递了Draw()消息,叫它们绘制自己吧,于是他们分别调用了自己类里定义的Draw()动作。通过这两条原则我们可以理解上面的多态。正是由于多态,使得我们不必要这样去做:IF你是一个CircleTHEN调用Circle的Draw()ELSEIF你是一个LineTHEN调用Line的Draw()ELSE…我们只要给这个被声明成为Shape的对象发送Draw消息,若何样去Draw就由对象自己去决定了。二.一切皆因虚函数先看看实现多态的基本条件:〔1〕基类含有虚函数〔2〕继承类把这个虚函数重新实现了〔3〕继承类也可能没有重新实现基类的所有虚函数,因此对于这些没有被重新实现的虚函数不能发生多态。再看一下几种语言里一些特别的规定:1.C++:〔1〕虚函数用virtual关键字声明。〔2〕virtualvoidFunc(para_list)=0;这样的虚函数叫做纯虚函数,表示这个函数没有具体实现。包含纯虚函数的类叫做抽象类,如果他的继承类没有对这个纯虚函数具体用代码实现,则这个继承类也是抽象类。抽象类不能被实例话〔就是说不能创立出对象〕。〔3〕继承类重新实现基类的虚函数时,不需要做任何特别的声明。〔4〕如果不用virtual关键字修饰,并且在派生类里重新实现了这个方法,这仅仅是一个简单的覆盖,不会发生多态,我们暂称它非多态吧。2.Java:〔1〕Java没有virtual关键字,Java把一切类的方法都认为是虚函数。〔2〕继承类重新实现基类的虚函数时,不需要做任何特别的声明。因此在Java里只要重新实现了基类的方法,并且把继承类对象声明为基类,多态就要发生。因此Java对多态的条件相对是对比低的。//JavaCodeclassBaseClass{publicvoidhello(){};}classDerivedClassextendsBaseClass{publicvoidhello(){System.out.println(“Helloworld!〞);}publicstaticvoidmain(Stringargs[]){BaseClassobj=newDerivedClass();obj.hello();}}输入是Helloworld!。这样就实现了多态。〔3〕虚函数用abstract声明,含有虚函数的类是抽象类,也要用abstract关键字修饰。//JavaCodepublicabstractAbstractClass{publicabstractvoidhello();//…}3.C#:C#对于多态的编写是最为严格和严谨的。〔1〕虚函数用virtual声明。〔2〕纯虚函数用abstract声明,含纯虚函数的类是抽象类,必须用abstract关键字修饰。〔3〕如果仅仅是覆盖基类的非虚方法,则需要用new关键字声明://C#CodepublicclassBaseClass{publicvoidhello(){System.Console.WriteLine(“Hello,thiscomefromBaseClass〞);}}publicclassDerivedClass:BaseClass{publicnewvoidhello(){System.Console.WriteLine(“Hello,thisiscomefromDerivedClass〞);}publicstaticvoidMain(){BaseClassobj=newDerivedClass();obj.hello();}}输出为Hello,thiscomefromBaseClass,也就是说这并没有实现多态〔非多态〕。〔4〕通过virtual–override、abstract–override组合实现多态。当派生类重新实现基类的虚函数〔或纯虚函数〕时,必须用override关键字进展修饰。//C#CodepublicabstractclassAbsBaseClass{publicabstractvoidhello();}publicclassDerivedClass:AbsBaseClass{publicvoidhello(){System.Console.WriteLine(“Helloworld!〞);}publicstaticvoidSayHello(AbsBaseClassobj){obj.hello();}publicstaticvoidMain(){DerivedClass_obj=newDerivedClass();DerivedClass.SayHello(_obj);}}输出为Helloworld!三.多态的反溯继承类对象在发生多态时,并是不完全抛开基类不管的,它会去查看基类的虚函数列表,在这个列表的范围内才会发生多态。让我们来看一个对比复杂的例子://JavaCodeclassA{protectedvoidhello(Objecto){System.out.println("A-Object");}}classBextendsA{protectedvoidhello(Strings){System.out.println("B-String");}protectedvoidhello(Objecto){System.out.println("B-Object");}};classC{publicstaticvoidmain(Stringargs[]){Objectobj=newObject();Stringstr="ABC";Aa=newB();a.hello(obj);a.hello(str);}};输出结果为:B–ObjectB–Object正如上面所说的,由于基类里没有参数类型为String的虚函数,因此B的hello(String)方法不参与多态。调用a.hello(str)时,由于String是Object的继承类,因此这个str被作为一个Object传入了B的hello(Object),这一点正如我们的原则一所述。四.接口——仅仅是更抽象的抽象类接口是类的协定,但由于接口又参与多态性,从这一点说,我们认为它是更为抽象的抽象类:CTS、CLS和CLR.NET结合Java和COM解决方案两者优点来解决互操作性问题。类似于COM定义的标准二进制格式,.NET定义了一个称为通用类型系统CommonTypeSystem(CTS)的类型标准。这个类型系统不但实现了COM的变量兼容类型,而且还定义了通过用户自定义类型的方式来进展类型扩展。任何以.NET平台作为目标的语言必须建设它的数据类型与CTS的类型间的映射。所有.NET语言共享这一类型系统,实现它们之间无缝的互操作。该方案还提供了语言之间的继承性。例如,用户能够在VB.NET中派生一个由C#编写的类。很显然,编程语言的区别不仅仅在于类型。例如,一些语言支持多继承性,一些语言支持无符号数据类型,一些语言支持运算符重载。用户应认识到这一点,因此.NET通过定义公共语言标准(CLS:CommonLanguageSpecification),限制了由这些不同引发的互操作性问题。CLS制定了一种以.NET平台为目标的语言所必须支持的最小特征,以及该语言与其他.NET语言之间实现互操作性所需要的完备特征。认识到这点很重要,这里讨论的特征问题已不仅仅是语言间的简单语法区别。例如,CLS并不去关心一种语言用什么关键字实现继承,只是关心该语言若何支持继承。CLS是CTS的一个子集。这就意味着一种语言特征可能符合CTS标准,但又超出CLS的范畴。例如:C#支持无符号数字类型,该特征能通过CTS的测试,但CLS却仅仅识别符号数字类型。因此,如果用户在一个组件中使用C#的无符号类型,就可能不能与不使用无符号类型的语言(如VB.NET)设计的.NET组件实现互操作。这里用的是“可能不〞,而不是“不可能〞,因为这一问题实际依赖于对non-CLS-compliant项的可见性。事实上,CLS规则只适用于或局部适用于那些与其他组件存在联系的组件中的类型。实际上,用户能够安全实现含私有组件的工程,而该组件使用了用户所选择使用的.NET语言的全部功能,且无需遵守CLS的标准。另一方面,如果用户需要.NET语言的互操作性,那么用户的组件中的公共项必须完全符合CLS标准。让我们来看下面的C#代码:publicclassFoo{//Theuint(unsignedinteger)typeisnon-CLScompliant.//Butsincethisitemisprivate,theCLSrulesdonotapply.privateuintA=4;//Sinceshisuintmemberispublic,wehaveaCLS//complianceissue.publicuintB=5;//ThelongtypeisCLScompliant.publiclongGetA(){returnA;}}最后一个C是公共语言运行库CommonLanguageRuntime(CLR)。简单地说,CLR是CTS的实现,也就是说,CLR是应用程序的执行引擎和功能齐全的类库,该类库严格按照CTS标准实现。作为程序执行引擎,CLR负责安全地载入和运行用户程序代码,包括对不用对象的垃圾回收和安全检查。在CLR监控之下运行的代码,称为托管代码(managedcode)。作为类库,CLR提供上百个可用的有用类型,而这些类型可通过继承进展扩展。对于文件I/O、创立对话框、启动线程等类型——基本上能使用WindowsAPI来完成的操作,都可由其完成。让我们正确对待“3C〞。开发人员在构建自己的分布式应用程序时,因为用户在编程时将直接面对CLR,应将主要精力放在学习了解CLR上,而不是CTS和CLS。而对于希望以.NET平台为目标的语言和工具开发商来说,就需要深入理解CTS和CLS。互操作性组件是分布式应用的关键,因此理解.NET若何通过定义公共类型实现这一目标,也就显得十分重要。4.列举一下你所了解的XML技术及其应用5.值类型和引用类型的区别写出C#的样例代码Ref与Out的区别。Ref与Out的区别是一样点:1.使参数按引用传递,注意这里的“引用〞与我们通常说的“对象引用〞不一样,可以形象的理解为,类似于C/C++中传指针〔地址〕。2.效果是,被调用方对该参数的修改会反映到该变量中,即当调用完毕返回时,调用方看到的是修改正的值。3.方法定义和调用方法都必须显式使用ref或者out关键字不同点:1。传递到ref的参数必须最先初始化,即由调用方显式初始化。2。传递到out的参数在传递之前不需要显式初始化,但需要调用方在方法返回之前必须对其赋值。使用场景:关于重载说明:1。ref和out关键字在运行时的处理方式不同,但在编译时的处理方式一样。因此,如果一个方法采用ref参数,而另一个方法采用out参数,则无法重载这两个方法。2。但是,如果一个方法采用ref或out参数,而另一个方法不采用这两类参数,则可以进展重载。使用ref前必须对变量赋值,out不用。out的函数会清空变量,即使变量已经赋值也不行,退出函数时所有out引用的变量都要赋值,ref引用的可以修改,也可以不修改。区别可以参看下面的代码:usingSystem;classTestApp{staticvoidoutTest(outintx,outinty){//离开这个函数前,必须对x和y赋值,否则会报错。//y=x;//上面这行会报错,因为使用了out后,x和y都清空了,需要重新赋值,即使调用函数前赋过值也不行x=1;y=2;}staticvoidrefTest(refintx,refinty){x=1;y=x;}publicstaticvoidMain(){//outtestinta,b;//out使用前,变量可以不赋值outTest(outa,outb);Console.WriteLine("a={0};b={1}",a,b);intc=11,d=22;outTest(outc,outd);Console.WriteLine("c={0};d={1}",c,d);//reftestintm,n;//refTest(refm,refn);//上面这行会出错,ref使用前,变量必须赋值into=11,p=22;refTest(refo,refp);Console.WriteLine("o={0};p={1}",o,p);}}6.ADO.net中常用的对象有哪些分别描述一下。Connection

对象Command与DataReader

对象DataSet

与DataAdapter

7.若何理解委托单从委托的概念上来讲,很简单,就是对方法的引用,包括静态方法和对象实例的方法,有点类似C语言中的方法指针,不过方法指针只能引用静态方法!而且委托是类安全的!一句话来概括:委托就是方法的入口!

调用委托就是调用方法,可能有人会说既然调用委托就是调用方法,那为什么不直接调用方法了,干吗非得通过委托来调用!一开场我也是这么想,包括现在也还有这个疑惑,个人觉得,如果撇开事件来说,委托除了匿名方法名称之外,没有具体实质型的好处!意思就是说我们如果不是在事件里用委托,和直接调用方法是没有本质区别的!

至于委托的声明格式,其基本语法为:修饰符delegate返回类型代理名称(参数列表)

比方说publicdelegatevoidMyDelegate(inti);实例化的时候给它赋值一个方法(实例或静态方法)名就可以了MyDelegateMD=newMyDelegate(类中的方法名)

委托还可以实现多重委托,可以用Combine方法讲不同代理组在一起,也可以用Remove方法从多重代理中除去一个代理,不过在我们实际使用可以不需要这么麻烦,用+,-可以到达这个目的!

比方说:

MyDelegateMD=newMyDelegate(方法1);

MyDelegateMD2=newMyDelegate(方法2);

MyDelegateMD3=MD+MD2;

也可以这么写MyDelegateMD3+=newMyDelegate(方法1);

MyDelegateMD3+=newMyDelegate(方法2);执行代理MD3就是调用方法1和方法2;

多重代理个人觉得在事件委托中用处很大,因为在实际对象中,一个方法执行会触发多个方法相继执行,这个时候会需要多重代理这个概念!使用多重代理的时候要注意方法返回类型必须是void类型的!PS:在代理类中有2个属性,一个是Method,表示所应用方法的名称!另一个是Target,表示实例方法所在对象的类型,如果是静态方法,则返回NULL

事件(Event)

正如我上面说的那样,如果撇开事件,委托好似没有多大用途,但也只是假设,委托就是为事件服务的,两者是分不开的.言事件比言委托!在C#中,事件和属性,方法一样,是类的一种成员,通过事件的使用,可以在类的对象发生某种变化,通过事件,来触发某些方法来处理事件的发生!

举个通俗的例子,在ASP.NET的窗体生成种,拖进来一个按钮,双击它,页面后台会自动生成按钮事件的方法名称,编程人员只要在该方法体内写上具体方法即可!那么按钮类里面是若何实现的了?

具体是这样的,在按钮类里面声明了一个事件委托:

publicenvetEventHandlerClick;

并写了一个触发该事件的方法:

protectedvirtualvoidOnClick(EventArgese)

{

if(Click!=Null)

{

Click(this,e)

}

}

而什么时候调用上面这个方法,根据程序构造类型不同而异,在WEB应用程序中,是通过回传事件接口来调用上面这个方法,在按钮类里只是实现了事件委托,具体双击按钮触发的实际方法是在页面程序里编写的!(PS:所以这也是我认为使用事件委托的最大好处,机动行好,灵活,如果不用委托,而是直接调用方法,那么所调用的方法就固定死了,不利于实际面向对象编程中出现的未预型方法,不灵活了)

在页面程序为按钮绑定事件委托所引用的方法是开发环境自动帮我们完成的,但我们要清楚实现的必要步骤:

在页面程序里必须给按钮的事件实例化方法,在ASP.NET的页面代码中的privatevoidInitializeComponent()里要写上:

this.Button1.Click+=newSystem.EventHandler(this.Button1_Click);//这里this.Button1_Click指具体执行的方法名称然后就可以在this.Button1_Click方法里写上具体要执行的代码!

综上所述,实现事件的步骤为:

1.声明事件委托;

2.触发事件的方法;

3.实例化事件委托(给委托添加引用方法)msdn2005中是这样解释的:

委托具有以下特点:委托类似于C++函数指针,但它是类型安全的。委托允许将方法作为参数进展传递。委托可用于定义回调方法。委托可以链接在一起;例如,可以对一个事件调用多个方法。方法不需要与委托签名准确匹配。有关更多信息,请参见协变和逆变。C#2.0版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独定义的方法。委托适用于那种在某些其他语言中需用函数指针来解决的情况〔场合〕。但是,与函数指针不同,委托是面向对象和类型安全的。委托声明定义一个类,它是从System.Delegate类派生的类。委托实例封装了一个调用列表,该列表列出了一个或多个方法,每个方法称为一个可调用实体。对于实例方法,可调用实体由一个实例和该实例的方法组成。对于静态方法,可调用实体仅由一个方法组成。如果用一组适宜的参数来调用一个委托实例,则该委托实例所封装的每个可调用实体都会被调用,并且用的都是上述的同一组参数。委托实例的一个有趣且有用的属性是:它既不知道也不关心有关它所封装的方法所属的类的种种详情;对它来说最重要的是这些方法与该委托的类型兼容〔第15.1节〕。这使委托非常适合“匿名〞调用。这是一个强大的功能。定义和使用委托分三个步骤:声明、实例化和调用。8.C#中的接口和类有什么异同。一个接口定义一个协定。实现接口的类或构造必须遵守其协定。接口可以包含方法、属性、索引器和事件作为成员。接口是负责功能的定义,工程中通过接口来标准类,操作类以及抽象类的概念!而类是负责功能的具体实现!在类中也有抽象类的定义,抽象类与接口的区别在于:抽象类是一个不完全的类,类里面有抽象的方法,属性,也可以有具体的方法和属性,需要进一步的专业化。但接口是一个行为的标准,里面的所有东西都是抽象的!一个类只可以继承一个基类也就是父类,但可以实现多个接口PS:接口除了标准一个行为之外,在具体工程中的实际作用也是十分重要的,在面向对象的设计原则以及设计模式的使用中,无不表达作为一个接口的使用好处,最直接的就是设计原则中OCP〔开放封闭原则〕,我们使用接口,而不需要关心他的具体实现,具体实现的细节变化也无关客户端〔使用接口的类〕的使用,对与扩展是开放的,我们可以另写一个接口的实现来扩展当前程序,而不影响上层的使用,但对修改是封闭的,即我们不能够再去修改接口的定义,当然这个“不能够〞是指在标准原则上不应该这么做!9.。net中读写数据库需要用到哪些类他们的作用10.UDP连接和TCP连接的异同。11.ASP.net的身份验证方式有哪些分别是什么原理12.进程和线程分别若何理解简单的说,你每启动一个程序,就启动了一个进程。在Windows3.x下,进程是最小运行单位。在Windows95/NT下,每个进程还可以启动几个线程,比方每下载一个文件可以单独开一个线程。在Windows95/NT下,线程是最小单位。WINDOWS的多任务特性使得线程之间独立运行,但是它们彼此共享虚拟空间,也就是共用变量,线程有可能会同时操作一片内存。线程与进程的区别多线程共存于应用程序中是现代操作系统中的基本特征和重要标志。用过UNIX操作系统的读者知道进程,在UNIX操作系统中,每个应用程序的执行都在操作系统内核中登记一个进程标志,操作系统根据分配的标志对应用程序的执行进展调度和系统资源分配,但进程和线程有什么区别呢进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:线程的划分尺度小于进程,使得多线程程序的并发性搞。另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口13.什么是code-Behind技术。14.活动目录的作用。15..net中读写XML的类都归属于哪些命名空间16.解释一下UDDI、WSDL的意义及其作用。17.什么是SOAP,有哪些应用。答:SOAP〔SimpleObjectAccessProtocol〕简单对象访问协议是在分散或分布式的环境中交换信息并执行远程过程调用的协议,是一个基于XML的协议。使用SOAP,不用考虑任何特定的传输协议〔最常用的还是协议〕,可以允许任何类型的对象或代码,在任何平台上,以任何一直语言相互通信。这种相互通信采用的是XML格式的消息,具体请看:://playist.blogchina/2521621.html18.若何部署一个ASP.net页面。19.若何理解.net中的垃圾回收机制。20.常用的调用webservice方法有哪些21.Virtual与abstraction区别?22.构造与类有何差异?哪些时候对比适合使用构造和类?它们的一样之处:1,两者都是Container类型,这表示它们可以包含其他数据类型作为成员.2,两者都拥有成员,这些成员包括:构造函数,方法,属性,字段,常量,枚举类型,事件,以及事件处理函数.3,两者的成员都有其各自的存取范围.例如,您可以将某一个成员声明为Public,而将另外一人成员声明为Private4,两者都可以实现接口.5,两者都可以公开一个默认属性,然而前提是这个属性至少要取得一个自变量.6,两者都可以声明和触发事件,而且两者都可以声明委托(Delegate).7,构造与类都可以完全是空的.它们的不同之处如下:1,构造是实值类型(ValueTypes),而类是引用类型(ReferenceTypes).2,构造使用载存储(StackAllocation),而类使用堆存储(HeapAllocation).3,所有构造成员默认都是Public,而类的变量与常量数则默认为(Private,不过其他类成员默认都是Public.4,构造成员国不能被声明为Protected,但是类成员可以这样做.5,构造变量声明不能指定初始值,使用new关键字词或对数组进展初始化,但类变量声明则可以这样做.6,构造不能声明默认的构造函数,也就是不拥有参数的非共享构造函数,但是类则无此限制.7,二者都可以拥有共享构造函数,构造的共享构造函数不能带有参数,但类的共享构造函数则可以带或者不带参数.8,构造不允许声明析构函数(Destructor),类则无此限制.9,构造的实例(Instance)声明,不允许对包含的变量进展初始化设定,类则可以在声明类的实例时,同时进展变量初始化.10,构造是隐式继承自ValueType类而且不能继承任何其它的类型,类则可以继承来自ValueType以外的任何类.11,构造是无法被继承的,类则可以被继承.12,构造永远不会终止,因此CommonLanguageRuntime(CLR)不会在任何构造上调用Finalize方法.类则是由内存回收进程加以终止,当内存回收进程检测到没有任何作用的类时,它就会调用类的Finalize方法.13,构造不需要构造函数,类则需要构造函数.14,构造只能在一种情况下使用非共享构造函数,那就是非共享构造函数会接收参数:但是类则无此限制,它可以使用带参数或不带参数的非共享构造函数.15,每一个构造都具有无参数的隐含公共构造函数.此构造函数会将构造的所有成员初始化为基默认值.您不能重新定义这个行为.除了上述的相似处与相异点之外,我们还可以在〞实例与变量〞层面上来探讨构造与类.由于构造是数值类型的,因此每个构造变量会永久地绑定到构造实例上.然而类是引用类型的,而且对象变量可引用不同的类实例.在此方面的区别,会对于使用构造与类造成以下影响:1构造变量会隐式地使用构造的无参数构造函数来初始化成员,这就意味着,语句StructlS就等于StructlS=newStructl();2当您好将一个构造变量赋值给另一个,或是将构造实例传递到程序变量时,所有变量成员的值会复制到新的构造中.当您将一个对象变量赋值给另一个,或是将对象变量传递到程序时,则只会复制指针.3,您可以将Null值赋值给构造变量,但是该实例会一直与该变量保持关联.虽然变量成员会因此赋值而重新初始化,但是您还是可以调用变量的方法并访问其数据成员.相反地,如果您将对象变量设定为Null,您就会中断它与任何类实例的关联,而且除非您再将另外一个实例赋值给它,否则无法通过变量访问任何成员.4,您可以在不同时间将不同的类的实例赋值给同一个对象变量,而且在同一时间可以有好几个对象变量引用一样的类实例,如果您对类成员值做了改变,则其它指向一样实例的对象变量也会发生改变.然而,构造成员则会封装在它们自己的实例中,变更构造成员值并不会对其它任何构造变量的成员造成影响,甚至也不会影响一样Struct声明的其它实例.5,两个构造必须以成员对成员的对比方式来执行相等对比.两个对象变量可以使用Equals方法来加以对比.Equals会判断两个变量是否指向一样的实例.在以下状况中,对比适合使用构造1,您拥有少量数据而且希望使用会传递的方式来为变量赋值时.2您会在每一个实例上执行大量的操作,而且假设使用堆来管理会造成性能下降.3,您不需要进展继承,而且不需要实例有特殊性.4,您不会采用Boxing与Unboxing构造.5,您会在Managed与UnManaged程序代码之间传递Blittable数据.在以下情况中,对比适合使用类:1,您需要使用继承与多态.2,您需要在创立阶段初始化一个或多个成员.3,您需要提供一个非参数型的构造函数.4,您需要没有任何限制的事件处理支持.23.谈谈你对二维树的理解?24.若何把一个array复制到arrayList里foreach(objectoinarray)arrayList.Add(o);25.datagrid.datasouse可以连接什么数据源[dataset,datatable,dataview]dataset,datatable,dataview,IList26.概述反射和序列化反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创立类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用通过Internet在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。27.概述o/rmapping的原理利用反射,配置将类于数据库表映射28.类成员有()种可访问形式可访问形式不懂。可访问性:public,protected,private,internal29.用sealed修饰的类有什么特点sealed修饰符用于防止从所修饰的类派生出其它类。如果一个密封类被指定为其他类的基类,则会发生编译时错误。密封类不能同时为抽象类。sealed修饰符主要用于防止非有意的派生,但是它还能促使某些运行时优化。具体说来,由于密封类永远不会有任何派生类,所以对密封类的实例的虚拟函数成员的调用可以转换为非虚拟调用来处理。30.C#中,stringstr=null与stringstr="",请尽量用文字说明区别。(要点:说明详细的内存空间分配)31.概述三层构造体系32.若何实现MVC模式,举例说明!33.。net中读写数据库需要用到哪些类他们的作用34.ASP.net的身份验证方式有哪些分别是什么原理35..netRemoting与webservices区别?36.C#可否对内存进展直接的操作37:您在什么情况下会用到虚方法它与接口有什么不同38:Override与重载有什么区别39:值类型与引用类型有什么区别40:若何理解静态变量41:向服务器发送请求有几种方式42:DataReader与DataSet有什么区别43:如果在一个B/S构造的系统中需要传递变量值,但是又不能使用Session、Cookie、Application,您有几种方法进展处理使用Server.Transfer这个方法相比上面介绍的方法稍微复杂一点,但在页面间值传递中却是特别有用的,使用该方法你可以在另一个页面以对象属性的方式来存取显露的值,当然了,使用这种方法,你需要额外写一些代码以创立一些属性以便可以在另一个页面访问它,但是,这个方式带来的好处也是显而易见的。总体来说,使用这种方法是简洁的同时又是面向对象的。使用这种方法的整个过程如下:1,在页面里添加必要的控件2,创立返回值的Get属性过程3,创立可以返回表单的按钮和链接按钮4,在按钮单击事件处理程序中调用Server.Transfer方法转移到指定的页面5,在第二个页面中,我们就可以使用Context.Handler属性来获得前一个页面实例对象的引用,通过它,就可以使用存取前一个页面的控件的值了以下代码综合实现上述步骤过程的代码:源页面代码:把以下的代码添加到页面中publicstringName{get{returnTextBox1.Text;}}publicstringEMail{get{returnTextBox2.Text;}}然后调用Server.Transfer方法privatevoidButton1_Click(objectsender,System.EventArgse){Server.Transfer("anotherwebform.aspx";}目标页面代码:privatevoidPage_Load(objectsender,System.EventArgse){//createinstanceofsourcewebformWebForm1wf1;//getreferencetocurrenthandlerinstancewf1=(WebForm1)Context.Handler;Label1.Text=wf1.Name;Label2.Text=wf1.EMail;}在ASP.NET2.0中启用了跨页面传送功能,其功能和用法在以后在做介绍!页面之间传递值方式1:在接收页的html代码里加上一行:<%@ReferencePage="WebForm1.aspx"%>WebForm1fp=(WebForm1)Context.Handler;this.TextBox1.Text=;//name是第一页的public变量Context提供对整个当前上下文〔包括请求对象〕的访问。您可以使用此类共享页之间的信息。方式2:GET方式在发送页publicintsum=0;inti=int.Parse(this.TextBox1.Text)*2;Server.Transfer("WebForm2.aspx?sum="+i);接收页this.TextBox1.Text=Request["sum"].ToString();orthis.TextBox1.Text=Request.Params["sum"].ToString();this.TextBox1.Text=Request.QueryString["sum"];方法3:全局变量发送页:Application["sum"]=this.TextBox1.Text;Server.Transfer("WebForm2.aspx";接收页:this.TextBox1.Text=(string)Application["sum"];Application实质上是整个虚拟目录中所有文件的集合,如果想在整个应用范围内使用某个变量值,Application对象将是最正确的选择在这里用Session[""]的方法雷同方法4:发送页:1.定义静态变量:publicstaticstringstr="";2.str=this.TextBox1.Text;Server.Transfer("webform2.aspx";接收页:1.引入第一页的命名空间:usingWebApplication1;2this.TextBox1.Text=WebForm1.str;44:软件开发过程一般有几个阶段每个阶段的作用45:微软推出了一系列的ApplicationBlock,请举出您所知道的ApplicationBlock并说明其作用46:请列举一些您用到过的设计模式以及在什么情况下使用该模式47:您对WebService的体会以下几道题目如果您不会,请较为详细的描述您的解决思路和方法48:通过超链接若何传递中文参数49:请编程遍历页面上所有TextBox控件并给它赋值为string.Empty50:请编程实现一个冒泡排序算法51.下面这段代码输出什么为什么inti=5;intj=5;if(Object.ReferenceEquals(i,j))Console.WriteLine("Equal");elseConsole.WriteLine("NotEqual");52.对于这样的一个枚举类型:enumColor:byte{Red,Green,Blue,Orange}string[]ss=Enum.GetNames(typeof(Color));byte[]bb=Enum.GetValues(typeof(Color));试写一段程序显示出枚举类型中定义的所有符号名称以及它们对应的数值。53.一个长度为10000的字符串,通过随机从a-z中抽取10000个字符组成。请用c#语言编写主要程序来实现。54.在c#中using和new这两个关键字有什么意义,请写出你所知道的意义using指令和语句new创立实例new隐藏基类中方法55下面这段代码有错误么switch(i){case():CaseZero();break;case1:CaseOne();break;case2:dufault;//wrongCaseTwo();break;}56当类T只声明了私有实例构造函数时,则在T的程序文本外部,___可以___〔可以or不可以〕从T派生出新的类,不可以____〔可以or不可以〕直接创立T的任何实例。12.下面的代码中有什么错误吗_______usingSystem;classA{publicvirtualvoidF(){Console.WriteLine("A.F");}}abstractclassB:A{publicabstractoverridevoidF();//newpublicabstractvoidF();}1.c#中的三元运算符是__?:___?2.当整数a赋值给一个object对象时,整数a将会被__装箱(封装)___?3.类成员有_____种可访问形式this.;newClass().Method;4.publicstaticconstintA=1;这段代码有错误么是什么const不能用static修饰5.floatf=-123.567F;inti=(int)f;i的值现在是_____?1236.利用operator声明且仅声明了“==〞,有什么错误么?7.委托声明的关键字是______?delagete8.用sealed修饰的类有什么特点密封,不能继承9.在A中所有的自定义用户控件都必须继承自________?Control10.在.Net中所有可序列化的类都被标记为_____?11.在.Net托管代码中我们不用担忧内存漏洞,这是因为有了______?gc1.有哪几种方法可以实现一个类存取另外一个类的成员函数及属性,并请举列来加以说明和分析.2.如果需记录类的实例个数,该若何实现,请写一个简单的类于以证明.3.A类是B类的基类,并且都有自己的构造,析构函数,请举例证明B类从实例化到消亡过程中构造,析构函数的执行过程.4.需要实现对一个字符串的处理,首先将该字符串首尾的空格去掉,如果字符串中间还有连续空格的话,仅保存一个空格,即允许字符串中间有多个空格,但连续的空格数不可超过一个.2、.net的错误处理机制是什么数据库方面:1.存储过程和函数的区别2.事务是什么3.游标的作用若何知道游标已经到了最后4.触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区别。1。用C#实现以下功能a产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。int[]intArr=newint[100];ArrayListmyList=newArrayList();Randomrnd=newRandom();while(myList.Count<100){intnum=rnd.Next(1,101);if(!myList.Contains(num))myList.Add(num);}for(inti=0;i<100;i++)intArr[i]=(int)myList[i];b对上面生成的数组排序,需要支持升序、降序两种顺序2。请说明在.net中常用的几种页面间传递参数的方法,并说出他们的优缺点。session(viewstate)简单,但易丧失application全局cookie简单,但可能不支持,可能被伪造inputttype="hidden"简单,可能被伪造url参数简单,显示于地址栏,长度有限数据库稳定,安全,但性能相对弱3。请说明.net中的错误处理机制,并举例trycatchfinal4。请说出强名的含义具有自己的key,可以在GAC(全局程序集缓存)为公用5。请列出c#中几种循环的方法,并指出他们的不同forwileforeach6。请指出.net中所有类型的基类object7。请指出GAC的含义8。SQLSREVER中,向一个表中插入了新数据,若何快捷的得到自增量字段的当前值试卷1.填空:(1)面向对象的语言具有________性、_________性、________性。(2)能用foreach遍历访问的对象需要实现________________接口或声明________________方法的类型。(3)列举ADO.net中的五个主要对象_______________、_____________、_______________、_______________、_________________。Connection,Command,DataReader,DataAdapter,DataSetconnection连接对象

command命令对象,指示要执行的命令和存储过程!

datareader是一个向前的只读的数据流。

dataadapter是功能强大的适陪器,支持增删改查的功能

dataset是一个数据级对象,相当与内存中的一张表或多张表!2.不定项选择:(1)以下表达正确的选项是:A.接口中可以有虚方法。B.一个类可以实现多个接口。C.接口不能被实例化。D.接口中可以包含已实现的方法。(2)从数据库读取记录,你可能用到的方法有:A.ExecuteNonQueryB.ExecuteScalarC.FillD.ExecuteReader3.简述private、protected、public、internal修饰符的访问权限。4.写出一条Sql语句:取出表A中第31到第40记录〔SQLServer,以自动增长的ID作为主键,注意:ID可能不是连续的。〕5.列举ASP.NET页面之间传递值的几种方式。6.写出程序的输出结果classClass1{privatestringstr="Class1.str";privateinti=0;staticvoidStringConvert(stringstr){str="stringbeingconverted.";}staticvoidStringConvert(Class1c){c.str="stringbeingconverted.";}staticvoidAdd(inti){i++;}staticvoidAddWithRef(refinti){i++;}staticvoidMain(){inti1=10;inti2=20;stringstr="str";Class1c=newClass1();Add(i1);AddWithRef(refi2);Add(c.i);StringConvert(str);StringConvert(c);Console.WriteLine(i1);Console.WriteLine(i2);Console.WriteLine(c.i);Console.WriteLine(str);Console.WriteLine(c.str);}}7.写出程序的输出结果publicabstractclassA{publicA(){Console.WriteLine('A');}publicvirtualvoidFun(){Console.WriteLine("A.Fun()");}}publicclassB:A{publicB(){Console.WriteLine('B');}publicnewvoidFun(){Console.WriteLine("B.Fun()");}publicstaticvoidMain(){Aa=newB();a.Fun();}}8.写出程序的输出结果:publicclassA{publicvirtualvoidFun1(inti){Console.WriteLine(i);}publicvoidFun2(Aa){a.Fun1(1);Fun1(5);}}publicclassB:A{publicoverridevoidFun1(inti){base.Fun1(i+1);}publicstaticvoidMain(){Bb=newB();Aa=newA();a.Fun2(b);b.Fun2(a);}}9.一列数的规则如下:1、1、2、3、5、8、13、21、34求第30位数是多少,用递归算法实现。(C#语言)10.程序设计:猫大叫一声,所有的老鼠都开场逃跑,主人被惊醒。(C#语言)要求:1.要有联动性,老鼠和主人的行为是被动的。2.考虑可扩展性,猫的叫声可能引起其他联动效应。参考答案:1.(1)继承性、封装性、多态性。〔考基本概念〕(2)IEnumerable、GetEnumerator(对foreach机制的理解,本来不想出这题的,凑分)(3)...(送分题,对ADO.net的了解)评分标准:一空1分,总分值10分。2.(1)B、C(考对接口的理解)(2)B、C、D(考察对ADO.net的熟练程度)评分标准:一题5分,不选或者错选均不得分。漏选得2分。总分值10分。3..private:私有成员,在类的内部才可以访问。protected:保护成员,该类内部和继承类中可以访问。public:公共成员,完全公开,没有访问限制。internal:在同一命名空间内可以访问。评分标准:答对1题2分,2题5分,3题7分。全对10分。(送分题)4.解1:selecttop10*fromAwhereidnotin(selecttop30idfromA)解2:selecttop10*fromAwhereid>(selectmax(id)from(selecttop30idfromA)asA)评分标准:写对即10分。(答案不唯一,datagrid分页可能需要用到)5.1.使用QueryString,如?id=1;response.Redirect()2.使用Session变量3.使用Server.Transfer等等评分标准:答对1点得3分,两点7分,3点10分。6.(考察值引用和对象引用)10210strstringbeingconverted.评分标准:答对一点得2分,总分值10分。7.ABA.Fun()评分标准:写出A.B得5分,写出A.Fun()得5分,总分值10分。(考察在继承类中构造函数,以及new方法,)8.2516评分标准:答对一点得2分,两点得5分,3点得7分。全对得10分。(一些人做这题,头都晕了^_^)9.publicclassMainClass{publicstaticvoidMain(){Console.WriteLine(Foo(30));}publicstaticintFoo(inti){if(i<=0)return0;elseif(i>0&&i<=2)return1;elsereturnFoo(i-1)+Foo(i-2);}}评分标准:写出returnFoo(i-1)+Foo(i-2);得5分。写出if(i>0&&i<=2)return1;得5分。方法参数过多需要扣分〔扣除分数=参数个数-1〕不用递归算法扣5分(递归算法在树构造建设等方面对比常用)10要点:1.联动效果,运行代码只要执行Cat.Cryed()方法。2.对老鼠和主人进展抽象评分标准:<1>.构造出Cat、Mouse、Master三个类,并能使程序运行(2分)<2>从Mouse和Master中提取抽象〔5分〕<3>联动效应,只要执行Cat.Cryed()就可以使老鼠逃跑,主人惊醒。(3分)publicinterfaceObserver{voidResponse();//观察者的响应,如是老鼠见到猫的反映}publicinterfaceSubject{voidAimAt(Observerobs);//针对哪些观察者,这里指猫的要扑捉的对象老鼠}publicclassMouse:Observer{privatestringname;publicMouse(stringname,Subjectsubj){=name;subj.AimAt(this);}publicvoidResponse(){Console.WriteLine(name+"attempttoescape!");}}publicclassMaster:Observer{publicMaster(Subjectsubj){subj.AimAt(this);}publicvoidResponse(){Console.WriteLine("Hostwaken!");}}publicclassCat:Subject{privateArrayListobservers;publicCat(){this.observers=newArrayList();}publicvoidAimAt(Observerobs){this.observers.Add(obs);}publicvoidCry(){Console.WriteLine("Catcryed!");foreach(Observerobsinthis.observers){obs.Response();}}}classMainClass{staticvoidMain(string[]args){Catcat=newCat();Mousemouse1=newMouse("mouse1",cat);Mousemouse2=newMouse("mouse2",cat);Mastermaster=newMaster(cat);cat.Cry();}}//设计方法二:使用event--delegate设计..publicdelegatevoidSubEventHandler();publicabstractclassSubject{publiceventSubEventHandlerSubEvent;protectedvoidFireAway(){if(this.SubEvent!=null)this.SubEvent();}}publicclassCat:Subject{publicvoidCry(){Console.WriteLine("catcryed.");this.FireAway();}}publicabstractclassObserver{publicObserver(Subjectsub){sub.SubEvent+=newSubEventHandler(Response);}publicabstractvoidResponse();}publicclassMouse:Observer{privatestringname;publicMouse(stringname,Subjectsub):base(sub){=name;}publicoverridevoidResponse(){Console.WriteLine(name+"attempttoescape!");}}publicclassMaster:Observer{publicMaster(Subjectsub):base(sub){}publicoverridevoidResponse(){Console.WriteLine("hostwaken");}}classClass1{staticvoidMain(string[]args){Catcat=newCat();Mousemouse1=newMouse("mouse1",cat);Mousemouse2=newMouse("mouse2",cat);Mastermaster=newM

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论