C#常见面试题


C#常见面试题 王牌7 1 C#常见面试题 一、基础问题 1. 如何在 C#中实现继承? 在类名后加上一个冒号,再加上基类的名称。 2. 私有成员会被继承么? 会,但是不能被访问。所以看上去他们似乎是不能被继承的,但实际上确实被继承了。 3. C#中所有对象共同的基类是什么? System.Object. 4. C#的 XML 文档注释中(以///开头的注释),标签用于描述什么?标签呢? 用于某个元素的概要说明,用于某个方法的参数概要说明。 5. const 和 readonly 有什么区别? const 可以用于局部常量,而 readonly,实际是类的 initonly 字段,显然不能是局部的。 6. C#支持多重继承么? 类之间不支持,接口之间支持。类对接口叫做实现,不叫继承。 7. 什么是抽象类(abstractclass)? 一种不可以被实例化的类。抽象类中一般含有抽象方法,当然也可有具体实现。继承 类只有实现过所有抽象类的抽象方法后才能被实例化。 C#从入门到精通 2 8. 试说明 continue 关键字的用处。 马上开始下一次循环,忽略循环体余下的语句。 9. 能够将非静态的方法覆写成静态方法么? 不能,覆写方法的签名必须与被覆写方法的签名保持一致,除了将 virtual 改为 override。 10. 接口(interface)是什么? 只含有共有抽象方法(publicabstractmethod)的类。这些方法必须在子类中被实现。 11. object 是 C#的关键字吗?请指出 C#中有哪些类型关键字,如 int、float。(提示,写得 越多越好)。 是,object、int、uint、long、ulong、short、ushort、byte、sbyte、char、float、double、 decimal、bool,如回答:enum、struct、class、delegate 也算对。 12. 重载和覆写有什么区别? 重载提供了对一个方法签名的不同参数调用的实现。覆写提供了子类中改变父类方法 行为的实现。 13. 我们知道 new 可以调用构造函数创建一个对象,那么 new 还有什么别的语法吗? 隐藏基类相同签名方法,如果在 C#2.0 中则还作为泛型构造函数约束(尽供参考)。 14. 被 protected 修饰的属性/方法在何处可以访问? 在继承或间接继承与这个类的子类中可以访问。 15. 什么是装箱和拆箱? 从值类型接口转换到引用类型装箱。从引用类型转换到值类型拆箱。 16. delegate 是引用类型还是值类型?enum、int[]和 string 呢? delegate 引用类型,enum 值类型,int[]引用类型,string 引用类型。 C#常见面试题 王牌7 3 17. ASP.net 的身份验证方式有哪些?分别是什么原理? Windwos(默认)用 IIS...From(窗体)用帐户....Passport(密钥) 18. 能够实现允许某个类被继承,但不允许其中的某个方法被覆写么? 可以,标记这个类为 public,并标记这个方法为 sealed。 19. 什么是 Code-Behind 技术? 代码后植。 20. 在循环:for(inti=0;i<100;i++)Console.WriteLine(i);中,请指出 i++的执行时机。 在 Console.WriterLine(i);执行之后。 21. CTS、CLS、CLR 分别作何解释? CTS:通用语言系统。CLS:通用语言规范。CLR:公共语言运行库。 22. net 中读写数据库需要用到那些类?他们的作用? DataSet:数据存储器。 DataCommand:执行语句命令。DataAdapter:数据的集合,用语填充。 23. base 这个关键字有哪几种语法?override 呢? base 两个语法,分别是调用基类构造函数和调用基类方法,override 用于重写基类方 法。 24. 什么是受管制的代码? unsafe:非托管代码。不经过 CLR 运行。 25. 接口和抽象类的区别是什么? 接口中所有方法必须是抽象的,并且不能指定方法的访问修饰符。抽象类中可以有方 法的实现,也可以指定方法的访问修饰符。 C#从入门到精通 4 26. System.String 和 System.StringBuilder 有什么区别? System.String 是不可变的字符串。System.StringBuilder 存放了一个可变的字符串,并 提供一些对这个字符串修改的方法。 二、简答论述题 1. 简述 private、protected、public、internal 修饰符的访问权限。 private:私有成员,在类的内部才可以访问。protected:保护成员,该类内部和继承类中可 以访问。public:公共成员,完全公开,没有访问限制。internal:在同一命名空间内可以访 问。 2. C#中的接口和类有什么异同。 接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念! 而类是负责功能的具体实现! 在类中也有抽象类的定义,抽象类与接口的区别在于: 抽象类是一个不完全的类,类里面有抽象的方法,属性,也可以有具体的方法和属性, 需要进一步的专业化。但接口是一个行为的规范,里面的所有东西都是抽象的!一个类 只可以继承一个基类也就是父类,但可以实现多个接口。 3. 在c#中using和new这两个关键字有什么意义,请写出你所知道的意义? Using 引入一个名子空间,或在使用了一个对像后自动调用其 IDespose,New 实例化 一个对像,或修饰一个方法,表此方法完全重写此方法。 4. 描述线程与进程的区别? 线程(Thread)与进程(Process)二者都定义了某种边界,不同的是进程定义的是应用 程序与应用程序之间的边界,不同的进程之间不能共享代码和数据空间,而线程定义的 是代码执行堆栈和执行上下文的边界。一个进程可以包括若干个线程,同时创建多个线 程来完成某项任务,便是多线程。而同一进程中的不同线程共享代码和数据空间。用一 个比喻来说,如果一个家庭代表一个进程,在家庭内部,各个成员就是线程,家庭中的 每个成员都有义务对家庭的财富进行积累,同时也有权利对家庭财富进行消费,当面对 一个任务的时候,家庭也可以派出几个成员来协同完成,而家庭之外的人则没有办法直 接消费不属于自己家庭的财产。 C#常见面试题 王牌7 5 5. 什么是 Windows 服务,它的生命周期与标准的 EXE 程序有什么不同 Windows 服务是运行在 windows 后台指定用户下(默认 System)的应用程序,它没有 标准的 UI 界面,想比标准的 EXE 程序,Windows 服务是在服务开始的时候创建,而在 服务结束的时候销毁,而且可以设置服务是否与操作系统一起启动,一起关闭。它支持 三种方式:1)自动方式 2)手动方式3)禁用。自动方式的时候,windows 服务将在 OS 启动后自动启动运行,而手动方式则必须手工启动服务,禁用的情况下服务将不能被 启动。另外标准的 EXE 默认使用的当前登录的用户,而 windows 服务则默认使用 System 用户,这在对系统资源访问的时候特别需要注意。 6. 用 sealed 修饰的类有什么特点 sealed 修饰符用于防止从所修饰的类派生出其它类。如果一个密封类被指定为其它类 的基类,则会发生编译时错误。 密封类不能同时为抽象类。 sealed 修饰符主要用于防止非有意的派生,但是它还能促使某些运行时优化。具体说 来,由于密封类永远不会有任何派生类,所以对密封类的实例的虚拟函数成员的调用可 以转换为非虚拟调用来处理。 7. 什么是强类型,什么是弱类型?哪种更好些?为什么? 强类型是在编译的时候就确定类型的数据,在执行时类型不能更改,而弱类型在执行 的时候才会确定类型。没有好不好,二者各有好处,强类型安全,因为它事先已经确定 好了,而且效率高。一般用于编译型编程语言,如c++,java,c#,pascal等,弱类型相比而言不 安全,在运行的时候容易出现错误,但它灵活,多用于解释型编程语言,如javascript,vb 等。 8. 什么是 GAC?它解决了什么问题? GloalAssemblyCache,全局应用程序集缓存。它解决了几个程序共享某一个程序集的 问题。不必再将那个被共享的程序集拷贝到应用程序目录了,其实这道理很简单,.net应 用程序在加载的时候,会首先查看全局应用程序集缓存,如果有就可以直接使用,没有 再到应用程序目录进行查找。 9. 阐述面向接口、面向对象、面向方面编程的区别 面向接口更关注的是概念,它的原则是先定义好行为规范,再根据行为规范创建实现, 严格的来说,面向接口应该是面向对象中的一部分吧,因为面向对象也强调的是本末倒 C#从入门到精通 6 置原则,也就是实现依赖于抽象,而抽象不依赖于具体实现,更具比较的应该是面向接 口与面向抽象对象,我的体会是面向接口更加灵活,但实现时候,稍微有些代码冗余, 而面向抽象可以结合面向接口,先定义接口,再定义抽象类,在抽象类中处理一些公共 逻辑,再实现具体实现类。面向对象是对复杂问题的分解。面向方面的编程是一种新概 念,它解决了很多面向对象无法解决的问题,比如面向对象技术只能对业务相关的代码 模块化,而无法对和业务无关的代码模块化。而面向方面正是解决这一问题的方案,它 的关键思想是"将应用程序中的商业逻辑与对其提供支持的通用服务进行分离"。 10. 什么是 Interface?它与 AbstractClass 有什么区别? 接口(Interface)是用来定义行为规范的,不会有具体实现,而抽象类除定义行为规范外, 可以有部分实现,但一个类能实现多个接口,但只能继承一个父类。 11. 如何理解委托? msdn2005 中是这样解释的: 委托具有以下特点: 委托类似于 C++函数指针,但它是类型安全的。 委托允许将方法作为参数进行传递。 委托可用于定义回调方法。 委托可以链接在一起;例如,可以对一个事件调用多个方法。 方法不需要与委托签名精确匹配。有关更多信息,请参见协变和逆变。 C#2.0 版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独 定义的方法。 12. DataReader 和 DataSet 的异同。 DataReader 和 DataSet 最大的区别在于,DataReader 使用时始终占用 SqlConnection,在 线操作数据库..任何对 SqlConnection 的操作都会引发 DataReader 的异常..因为 DataReader 每次只在内存中加载一条数据,所以占用的内存是很小的..因为 DataReader 的特殊性和高 性能.所以 DataReader 是只进的..你读了第一条后就不能再去读取第一条了。 DataSet 则是将数据一次性加载在内存中.抛弃数据库连接..读取完毕即放弃数据库连 接..因为 DataSet 将数据全部加载在内存中.所以比较消耗内存...但是确比 DataReader 要灵 活..可以动态的添加行,列,数据.对数据库进行回传更新操作。 13. 什么是反射? 程序集包含模块,而模块又包括类型,类型下有成员,反射就是管理程序集,模块, C#常见面试题 王牌7 7 类型的对象,它能够动态的创建类型的实例,设置现有对象的类型或者获取现有对象的 类型,能调用类型的方法和访问类型的字段属性。它是在运行时创建和使用类型实例 14. C#中接口和类的异同。 接口和类都是类,不同的事,接口只包含方法或属性的声明,不包含具体实现方法的 代码,接口可以实现多继承,而类只能是单继承,继承接口的类必须实现接口中声明的 方法或属性。接口主要定义一种规范,统一调用方法,在大型项目中接口正发挥日益重 要的作用。 15. 请叙述 const 与 readonly 的区别。 每一个 class 至多只可以定义一个 static 构造函数,并且不允许增加访问级别关键字, 参数列必须为空。为了不违背编码规则,通常把 static 数据成员声明为 private,然后通过 statciproperty 提供读写访问。const 关键字用于修改字段或局部变量的声明。它指定字段 或局部变量的值不能被修改。常数声明引入给定类型的一个或多个常数。const 数据成员 的声明式必须包含初值,且初值必须是一个常量表达式。因为它是在编译时就需要完全 评估。const 成员可以使用另一个 const 成员来初始化,前提是两者之间没有循环依赖。 readonly 在运行期评估赋值,使我们得以在确保“只读访问”的前提下,把 object 的初始化 动作推迟到运行期进行。readonly 关键字与 const 关键字不同:const 字段只能在该字段的 声明中初始化。readonly 字段可以在声明或构造函数中初始化。因此,根据所使用的构造 函数,readonly 字段可能具有不同的值。另外,const 字段是编译时常数,而 readonly 字 段可用于运行时常数。readonly 只能在声明时或者构造函数里面初始化,并且不能在 static 修饰的构造函数里面。 16. 从概念上阐述前期绑定(early-binding)和后期绑定(late-binding)的区别? 这个就像是强弱类型的比较相似,前期绑定是在编译的时候就确定了要绑定的数据, 而后期绑定是在运行的时候才填充数据。所以前期绑定如果失败,会在编译时报编译错 误,而后期绑定失败只有在运行时的时候才发生 17. 概述反射和序列化。 反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、 模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象, 或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性 序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象, 然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将 从该流重新构造对象。 C#从入门到精通 8 18. 请问:String 类与 StringBuilder 类有什么区别?为什么在.Net 类库中要同时存在这 2 个 类? 如果要操作一个不断增长的字符串,尽量不用 String 类,改用 StringBuilder 类。两个类 的工作原理不同:String 类是一种传统的修改字符串的方式,它确实可以完成把一个字符串 添加到另一个字符串上的工作没错,但是在.NET 框架下,这个操作实在是划不来。因为系 统先是把两个字符串写入内存,接着删除原来的 String 对象,然后创建一个 String 对象, 并读取内存中的数据赋给该对象。这一来二去的,耗了不少时间。而使用 System.Text 命 名空间下面的 StringBuilder 类就不是这样了,它提供的 Append 方法,能够在已有对象的 原地进行字符串的修改,简单而且直接。当然,一般情况下觉察不到这二者效率的差异, 但如果你要对某个字符串进行大量的添加操作,那么 StringBuilder 类所耗费的时间和 String 类简直不是一个数量级的。 19. 请叙述属性与索引器的区别。 属性索引器 通过名称标识。通过签名标识。 通过简单名称或成员访问来访问。通过元素访问来访问。 可以为静态成员或实例成员。必须为实例成员。 属性的 get 访问器没有参数。索引器的 get 访问器具有与索引器相同的形参表。 属性的 set 访问器包含隐式 value 参数。除了 value 参数外,索引器的 set 访问器还具 有与索引器相同的形参表。 20. 请叙述类与结构的区别。 (1) 结构是值类型; (2) 结构不支持继承; (3) 结构不能定义默认的构造函数; (4) 结构不能定义析构函数; (5) 结构不能使用初始值设置域值。 三、程序题 1. 下面的例子中 usingSystem; classA{ C#常见面试题 王牌7 9 publicstaticintX; staticA(){ X=B.Y+1.} } classB{ publicstaticintY=A.X+1.staticB(){} staticvoidMain(){ Console.WriteLine("X={0},Y={1}",A.X,B.Y); } } 产生的输出结果是什么? x=1,y=24。 2. 在下面的例子里 usingSystem; classA{ publicA(){ PrintFields(); } publicvirtualvoidPrintFields(){} } classB:A{ intx=1.inty; publicB(){ y=-1.} publicoverridevoidPrintFields(){ Console.WriteLine("x={0},y={1}",x,y); } 当使用 newB()创建 B 的实例时,产生什么输出? X=1,Y=0。 3. 在下面的代码中 abstractclassBaseClass { publicvirtualvoidMethodA() {} C#从入门到精通 10 publicvirtualvoidMethodB() {} } classClass1:BaseClass { publicvoidMethodA(stringarg) {} publicoverridevoidMethodB() {} } classClass2:Class1.newpublicvoidMethodB() {} } classMainClass { publicstaticvoidMain(string[]args) { Class2o=newClass2(); Console.WriteLine(o.MethodA()); } } 请问,o.MethodA 调用的是什么? BaseClass.Method 4. 下面的代码中有什么错误吗? usingSystem; classA{ publicvirtualvoidF(){ Console.WriteLine("A.F"); } } abstractclassB:A{ publicabstractoverridevoidF(); } abstractoverride 是不可以一起修饰。 C#常见面试题 王牌7 11 5. 在下面的例子里 usingSystem; classA{ publicA() { PrintFields(); } publicvirtualvoidPrintFields(){} } classB:A { intx=1.inty; publicB() { y=-1. } publicoverridevoidPrintFields() { Console.WriteLine("x={0},y={1}",x,y); } 当使用 newB()创建 B 的实例时,产生什么输出? X=1,Y=0;x=1y=-113. 6. 产生一个 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]; C#从入门到精通 12 7. What’sthefinalresult? (下面这段代码的最终运行结果是什么) doubleexpectedValue=1/2; if(expectedValue>0) { expectedValue=expectedValue+0.5; } Console.WriteLine(expectedValue); 结果是 0。 8. 写一个实现对一段字符串翻转的方法,附加一些条件,如其中包括“,”、“.”,对其设 计测试用例。 usingSystem.Text; stringinputStr="a,b,c,d,e,f,g,h,i,j,k,l"; char[]inputChar=inputStr.ToCharArray(); intcount=inputChar.Length; StringBuildersb=newStringBuilder(); for(intm=count-1;m>=0;m--) { sb.Append(inputChar[m]); } 9. 编写一个类,(构造,公有,私有方法,静态,私有变量)。 publicclassstu { privatestringname; publicstaticintcount; publicstu() { } publicstringName { get{returnname;} set{name=value;} } privatestringMethod1() C#常见面试题 王牌7 13 { Response.Write(“私有方法”); } publicstringMethod2() { Response.Write(“公有方法”); } } 10. 数据库的高级查询: ⑴ 读出没有修的课程 selectnamefromBwhereidnotin(selectcidfromC) ⑵ 读出所修人数超过 100 人的课程 selectnamefromBwhereidin(selectcidfromCgroupbycidhavingcount(sid)>100) ⑶ 列出所有课程的名称以及所修人数 selectnameas 课程名,count(sid)as 人数 fromB,C whereB.id=C.cid groupbyname ⑷ 怎样提高查询速度 C#从入门到精通 14 答:用存储过程,数据量太大了,尽量分页查询,增加数据冗语,把常用的数据集中 在 1 到 2 个表中。
还剩13页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

linjialong

贡献于2013-12-06

下载需要 5 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf