1、C基础题一、问答题:1、 简述 private、 protected、 public、 internal 修饰符的访问权限private : 私有成员, 在类的内部才可以访问。 protected : 保护成员,该类内部和继承类中可以访问。public : 公共成员,完全公开,没有访问限制。internal: 在同一命名空间内可以访问。2、 override 与重载的区别Override 用来重写父类的方法,重载使用相同名的方法或操作符拥有不同类型的参数3、 C中接口和类的异同接口和类都是类,不同的事,接口只包含方法或属性的声明,不包含具体实现方法的代码,接口可以实现多继承,而类只能是单继承,
2、继承接口的类必须实现接口中声明的方法或属性。接口主要定义一种规范,统一调用方法,在大型项目中接口正发挥日益重要的作用。4、 在 c#中 using 和 new 这两个关键字有什么意义,请写出你所知道的意义Using 引入一个名子空间,或在使用了一个对像后自动调用其 IDespose,New 实例化一个对像,或修饰一个方法,表此方法完全重写此方法。5、 谈谈类和结构的区别最大区别一个是引用类型,一个是值类型 默认成员访问为 public 是另外一个区别。6、 概述反射和序列化反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类
3、型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。7、 用 sealed 修饰的类有什么特点sealed 修饰符用于防止从所修饰的类派生出其它类。如果一个密封类被指定为其它类的基类,则会发生编译时错误,密封类不能同时为抽象类。sealed 修饰符主要用于防止非有意的派生,但是它还能促使某些运行时优化。具体说来,由于密封类永远不会有任何派生类,所以对密封类的实
4、例的虚拟函数成员的调用可以转换为非虚拟调用来处理。8、 类成员有几种可访问形式可访问性:public ,protected ,private,internal。9、 C#中,string str = null 与 string str =“,请尽量用文字说明区别。(要点:说明详细的内存空间分配)string str =“ 分配空间。10、面向对象的思想主要包括什么?封装、继承、多态封装:用抽象的数据类型将数据和基础数据的操作封装在一起,数据被保护在抽象数据类型内部。继承:子类拥有父类所有的数据和操作。多态:一个程序中同名的不同方法共存的情况。多态有两中形式重载与重写。11、如何理解委托?据说相
5、当于函数指针,定义了委托就可以在不调用原方法名称的情况下调用那个方法。12、C#中的接口和类有什么异同接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念。类是负责具体功能的实现。在类中也有抽象类的定义,抽象类与接口的区别在于:抽象类是一个不完全的类,类里面有抽象的方法、属性,也可以有具体的方法和属性,需要进一步专业化。但接口是一个行为的规范,里面的所有的东西都是抽象的。一个类只可以继承一个基类也就是父类,但可以实现多个接口。13、进程和线程分别怎么理解进程就是计算机中正在执行的程序(即处于活动状态的程序),每一个进程都有自己独立的一块内存空间和一组系统资源。线程和进程有很多相
6、似的特征,线程可以被开作是进程的进一步细分,也就是把进程完成的任务划分成一个个更小的子任务,每一个子任务就是一个线程,然后用细分的这些线程分别去执行。线程是基于进程的一个级别运行单位,线程同样包括一个内存入口地址、一个出口地址以及能够执行的代码序列。但是线程和进程的根本区别在于线程不能够单独执行,它必须运行在处于活动状态的进程中。14、什么是装箱和拆箱装箱就是隐式将一个值类型转换为引用类型对象。拆箱就是将一个引用类型对象转换成任意值类型。15、什么是重载?重载分为普通方法重载和基类虚方法重载。普通方法重载是指:类中两个以上的方法(包括隐藏的继承而来的方法),取相同的名字,但使用的参数类型或参数
7、个数不同。对基类方法的重载是函数重载的另一种特殊形式。在派生类中重新定义此虚函数。方法名称、返回值类型、参数表中的参数个数、类型、顺序都必须和基类中的虚方法一致。在排成类中声明对虚方法的重载,要求在声明中加上override 关键字,而且不能有 new、static 或、virtual 修饰符;16、值类型和引用类型的区别?值类型:单元直接存放有效值。如:int I 3; 则 I 内存单元就存放 3。引用类型:单元放的是另外一个对象的引用(地址)。如:Form form1=new Form();就是说在内存中开辟了一个对象 new Form(),form1 内存单元存放的就是那个对象的地址,并
8、非对象本身。17、情描述属性与索引器的区别属性:通过名称标识。通过简单名称或成员访问来访问。可以为静态成员或实例成员。属性的 get 访问器没有参数。属性的 set 访问器包含隐式的 value 参数。索引器:通过签名标识。通过元素访问来访问。必须为实例成员。索引器的 get 访问器具有与索引器相同的形参表。除了 value 参数外,索引器的 set 访问器还与索引器相同的形参表。18、情叙述 count 与 readonly 的区别每一个类之多只可以定义一个 static 构造函数,并且不运行增加访问级别关键字,参数必须为空。为了不违背编码规则,通常把 static 成员声明为 privat
9、e,然后通过 static property 提供读写访问。count 关键字用于修改字段或局部变量的声明。它制定字段或局部变量的值不能被修改。常数声明引入给的类型的一个或多个常数。count 数据成员的声明形式必须包含初始值,且初始值必须是一个常量表达式。因为它是在编译时就需要完全评估的。count 成员可以使用另一个 count 成员来初始化,前提是两者直接没有循环依赖。readonly 在运气期评估赋值,使我们得以在确保“只读访问”的前提下,把 object 初始化动作推迟到运行期间。readonly 关键字与 count 关键字的不同:const 字段只能在该字段的声明中初始化。rea
10、donly 字段可以在声明或构造函数中初始化。因此,根据所使用的构造函数,readonly 字段可能具有不同的值。另外,const 字段是编译时常数,而 readonly 字段可用于运行时常数。readonly 只能在声明时或者构造函数里面初始化,并且不能在 static 修饰的构造函数里面。19、谈谈类和结构的区别最大区别一个是引用类型,一个是值类型 默认成员访问为 public 是另外一个区别20、描述一下 C#中索引器的实现过程,是否只能根据数字进行索引?不是。可以用任意类型。二、选择题1、以下哪些可以作为接口成员(多选)(ABCD)A方法 B、属性 C、字段 D、事件 E、索引器 F、
11、构造函数 G、析构函数2、以下关于 ref 和 out 的描述哪项是正确的(多项)(ACD)A、使用 ref 参数,传递到 ref 参数的参数必须最先初始化。B、使用 out 参数,传递到 out 参数的参数必须最先初始化。C、使用 ref 参数,必须将参数作为 ref 参数显示传递到方法。D、使用 out 参数,必须将参数作为 out 参数显示传递到方法。3、”访问范围限定为此程序或那些由它所属的类派生的类型”是对以下哪个成员可访问性含义的正确描述(B)A、public B、protected C、internal D、protected internal4、下列选项中, (C)是引用类型。
12、a)enum 类型 b)struct 类型 c)string 类型 d)int 类型5、以下描述错误的是(A)a)在 C+中支持抽象类而在 C#中不支持抽象类。b)C+中可在头文件中声明类的成员而在 CPP 文件中定义类的成员,在 C#中没有头文件并且在同一处声明和定义类的成员。c)在 C#中可使用 new 修饰符显式隐藏从基类继承的成员。d)在 C#中要在派生类中重新定义基类的虚函数必须在前面加 Override。6、C#的数据类型有(D)a)值类型和调用类型; b)值类型和引用类型;c)引用类型和关系类型;d)关系类型和调用类型;7、下列描述错误的是(D)a)类不可以多重继承而接口可以;b
13、)抽象类自身可以定义成员而接口不可以;c)抽象类和接口都不能被实例化;d)一个类可以有多个基类和多个基接口;8、下列关于构造函数的描述正确的是(C)a)构造函数可以声明返回类型。b)构造函数不可以用 private 修饰c)构造函数必须与类名相同d)构造函数不能带参数9、.int myArray3=new int3new int35,6,2,new int56,9,7,8,3,new int23,2; myArray322的值是(D ) 。a)9 b)2 c)6 d)越界10、接口是一种引用类型,在接口中可以声明(A) ,但不可以声明公有的域或私有的成员变量。a)方法、属性、索引器和事件; b
14、)方法、属性信息、属性; c)索引器和字段; d)事件和字段;11、. 下列关于 C#中索引器理解正确的是(B/C )a)索引器的参数必须是两个或两个以上 b)索引器的参数类型必须是整数型c)索引器没有名字 d)以上皆非12、装箱、拆箱操作发生在: ( C )A.类与对象之间 B.对象与对象之间C.引用类型与值类型之间 D.引用类型与引用类型之间13、用户类若想支持 Foreach 语句需要实现的接口是: ( A )A.IEnumerable B.IEnumeratorC.ICollection D.ICollectData14、装箱与拆箱操作是否是互逆的操作?( B )A.是 B.否15、以
15、下哪个是可以变长的数组?( D )A.Array B.stringC.stringN D.ArrayList16、对于一个实现了 IDisposable 接口的类,以下哪些项可以执行与释放或重置非托管资源相关的应用程序定义的任务?(多选) (ABC)A.Close B.DisposeC.FinalizeD.using E.Quit三、程序题1、using System;class Apublic A()PrintFields();public virtual void PrintFields()class B:Aint x=1;int y;public B()y=-1;public overr
16、ide void PrintFields()Console.WriteLine(“x=0,y=1“,x,y);当使用 new B()创建 B 的实例时,产生什么输出?X1,Y=02、using System;class Apublic static int X;static A()X=B.Y+1;class Bpublic static int Y=A.X+1;static B()static void Main()Console.WriteLine(“X=0,Y=1“,A.X,B.Y);产生的输出结果是什么?x1,y=23、一列数的规则如下: 1、1、2、 3、5 、8、13 、21、34.
17、 求第 30 位数是多少, 用递归算法实现public class MainClass public static void Main() Console.WriteLine(Foo(30); public static int Foo(int i) if (i 0 else return Foo(i -1) + Foo(i - 2); 4、请编程遍历页面上所有 TextBox 控件并给它赋值为 string.Empty?foreach (System.Windows.Forms.Control control in this.Controls) if (control is System.W
18、indows.Forms.TextBox) System.Windows.Forms.TextBox tb = (System.Windows.Forms.TextBox)control ; tb.Text = String.Empty ; 5、请编程实现一个冒泡排序算法?int array = new int * ; int temp = 0 ; for (int i = 0 ; i array.Length - 1 ; i+) for (int j = i + 1 ; j array.Length ; j+) if (arrayj arrayi) temp = arrayi ; array
19、i = arrayj ; arrayj = temp ; 6、求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+mint Num = this.TextBox1.Text.ToString() ; int Sum = 0 ; for (int i = 0 ; i Num + 1 ; i+) if(i%2) = 1) Sum += i ; else Sum = Sum - I ; System.Console.WriteLine(Sum.ToString(); System.Console.ReadLine() ;7、在下面的例子里using System; class A p
20、ublic A() PrintFields(); public virtual void PrintFields() class B:A int x=1; int y; public B() y=-1; public override void PrintFields() Console.WriteLine(“x=0,y=1“,x,y); 当使用 new B()创建 B 的实例时,产生什么输出?X=1,Y=0;x= 1 y = -18、根据委托(delegate)的知识,请完成以下用户控件中代码片段的填写:namespace test public delegate void OnDBOper
21、ate(); public class UserControlBase : System.Windows.Forms.UserControl public event OnDBOperate OnNew; privatevoidtoolBar_ButtonClick(objectsender,System.Windows.Forms.ToolBarButtonClickEventArgs e) if(e.Button.Equals(BtnNew) /请在以下补齐代码用来调用 OnDBOperate 委托签名的 OnNew 事件。 补填的代码为:if( OnNew != null OnNew( this, e );9、a 产生一个 int 数组,长度为 100,并向其中随机插入 1-100,并且不能重复List L=new List(); Random random = new Random(); for (int i = 1; i = 100; i+) if (L.IndexOf(i) 0) L.Add(random.Next(1,100); 10、