一.填空题(每空1分,共12分)1面向对象的语言具有__封装______性、__继承_______性、__多态______性。2能用foreach遍历访问的对象需要实现____Ienumerable____________接口或声明_____GetEnumerator___________方法的类型。3当类T只声明了私有实例构造函数时,则在T的程序文本外部,___不可以___(可以or不可以)从T派生出新的类,在T的内部__可以__(可以or不可以)直接创建T的任何实例,在T的外部__不可以__(可以or不可以)直接创建T的任何实例。4.委托声明的关键字是__Delegate____5.override与重载的区别:override覆盖是基类中函数的重写。重载:方法或函数的名称相同,参数或许参数类型不同,进行多次重载实现功能。二.不定项选择(每题2分,共18)Question1以下叙述正确的是:A.接口中可以有虚方法。B.一个类可以实现多个接口。C.接口不能被实例化。D.接口中可以包含已实现的方法。Question2以下描述错误的是()1.在C++中支持抽象类而在C#中不支持抽象类。2.C++中可在头文件中声明类的成员而在CPP文件中定义类的成员,在C#中没有头文件并且在同一处声明和定义类的成员。3.在C#中可使用new修饰符显式隐藏从基类继承的成员。4.在C#中要在派生类中重新定义基类的虚函数必须在前面加Override。Question3声明一个委托publicdelegateintmyCallBack(intx);则用该委托产生的回调方法的原型应该是1.voidmyCallBack(intx)2.intreceive(intnum)3.stringreceive(intx)4.不确定的Question4下列描述错误的是()a)类不可以多重继承而接口可以;b)抽象类自身可以定义成员而接口不可以;c)抽象类和接口都不能被实例化;d)一个类可以有多个基类和多个基接口;Question5下列关于构造函数的描述正确的是()a)构造函数可以声明返回类型。b)构造函数不可以用private修饰c)构造函数必须与类名相同d)构造函数不能带参数Question6接口是一种引用类型,在接口中可以声明(),但不可以声明公有的域或私有的成员变量。a)方法、属性、索引器和事件;b)方法、属性信息、属性;c)索引器和字段;d)事件和字段;Question7以下的C#代码,试图用来定义一个接口:publicinterfaceIFile{intA;intdelFile(){A=3;}voiddisFile();}关于以上的代码,以下描述错误的是()。a)以上的代码中存在的错误包括:不能在接口中定义变量,所以intA代码行将出现错误;b)以上的代码中存在的错误包括:接口方法delFile是不允许实现的,所以不能编写具体的实现函数;c)代码voiddisFile();声明无错误,接口可以没有返回值;d)代码voiddisFile();应该编写为voiddisFile(){};Question8.classClass1{publicstaticintCount=0;staticClass1(){Count++;}publicClass1(){Count++;}}Class1o1=newClass1();Class1o2=newClass1();请问,Class1.Count的值是多少?()1.12.23.34.4Question9abstractclassBaseClass{publicvirtualvoidMethodA(){Console.WriteLine(BaseClass);}publicvirtualvoidMethodB(){}}classClass1:BaseClass{publicvoidMethodA(){Console.WriteLine(Class1);}publicoverridevoidMethodB(){}}classClass2:Class1{newpublicvoidMethodB(){}}classMainClass{publicstaticvoidMain(string[]args){Class2o=newClass2();o.MethodA();}}请问,此程序输出结果是:1.BaseClass2.BassClassClass13.Class14.Class1BassClass(解析,三重继承问题,孙类只是继承父类,而不是直接继承祖父类)三.问答题(每题3分,共15分)1.简述private、protected、public、internal修饰符的访问权限。private:私有访问,它只能在声明自身的类中进行访问。protected:表示受保护的访问,该类内部和继承类中可以访问.public:表示公共访问,在代码任何位置都可对其进行访问internal表示内部成员,在同一命名空间内可以访问。2.C#中的委托是什么?事件是不是一种委托?委托是指具有相同属性(也称具有相同的函数签名:返回类型相同,参数类型、参数顺序及参数个数相同)的函数或方法的抽象,关键字为delegate。主要用途是三个:1)函数回调;2)传递方法;3)事件机制事件就是一个狭义的委托,也就是事件是一个用于事件驱动模型的专用委托,对事件的声明,实际是声明一个私有的委托变量,对委托变量进行封装,即委托变量加上event关键字后,不管其前面的访问修饰符是public还是private,编译器都会将其编译为private。委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。以委托为参数的函数具有一定的通用性。使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个词,是因为此变量代表一个方法),可以依次调用所有绑定的方法。3.abstract可以和virtual一起使用吗?可以和override一起使用吗?不可以一起使用,但是可以和override一起使用。4.请叙述属性与索引器的区别。属性:它是存取类的字段,索引器:Indexer它是特殊的属性,用它可以使用户像访问数组一样访问类的成员。5.请详述在dotnet中类(class)与结构(struct)的异同。类class可以进行实例化,它是引用类型,内存分配在栈中,效率高,它有默认的构造函数,有析构函数可以使用abstract和sealed,protected修饰符。要用new进行初始化,结构它是属于值类型,内存分配在堆中,效率低,它没有默认的构造函数,但是可以添加构造函数,没有析构函数没有abstract和sealed(因为不能继承)不能有protected修饰符可以不使用new初始化,但是可以在结构中初始化实例字段。四.分析程序(每题5分,共25分)(此题不能调试,若发现调试,扣除分数)1.写出程序的输出结果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);}}10210strstringbeingconverted2.写出程序的输出结果publicabstractclassA{publicA(){Console.WriteLine('A');}publicvirtualvoidFun(){Console.WriteLine(A.Fun());}}publicclassB:A{publicB(){Console.WriteLine('B');}publicoverridevoidFun(){Console.WriteLine(B.Fun());}publicstaticvoidMain(){Aa=newB();a.Fun();}}解析:主函数Aa=newB();首先声明了一个A的对象a,但被赋给不同于A的对象B,在此期间分别调用了A类的构造函数和B类的构造函数,然后调用a的fun()函数,因为a的fun()函数是虚函数,被b的fun()的函数覆盖,所以实际执行的是b的fun().答案:ABB.Fun()3.写出程序的输出结果: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();b.Fun2(a);a.Fun2(b);}}输出结果为:2516(一个函数的执行必须在一个具体的对象中实现,如果函数明确告诉是哪个对象,则在改该对象下执行;如果没有,则在默认的对象下执行)4.在下面的例子里usingSystem;classA{publicA(){PrintFields();}publicvirtualvoidPrintFields(){}}classB:A{intx=4;inty;publicB(){y=-1;}publicoverridevoidPrintFields(){x+=1;Console.WriteLine(x={0},y={1},x,y);y+=1;}当使用Bb=newB()创建的实例时,产生什么输出?b.PrintFields();结果是什么?X=5,y=0b.PrintFields结果是x=6;y=15.下面的例子中usingSystem;classA{publicstaticintX;staticA(){X=B.Y+1;}}classB{publicstaticintY=A.X+1;staticB(){}staticvoidMain(){Console.WriteLine(X={0},Y={1},A.X,B.Y);}}产生的输出结果是什么?X=2,Y=1五.程序设计(每题7分,共28分)1.请编程实现一个冒泡排序算法?//比较法usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespacetest1{classProgram{staticvoidMain(string[]args){int[]Array={6,18,12,23,19,28,30};Console.WriteLine(排序前的数组:);foreach(intninArray){Console.Write(n+);}Console.WriteLine();for(inti=1;iArray.Length;i++)//控制趟数{for(intj=0;jArray.Length-i;j++){if(