C# & .NET软件工程师面试
以下答案纯属个人理解及总结,希望给正在找工作的朋友们一点小小的参考,欢迎批评指正。
一、常见面试题解析
1.C#中堆和栈的区别
答:堆:由程序员分配内存空间,并指明大小,一般速度比较慢,而且容易产生内存碎片,不过用起来很方便,地址由低向高增长。
栈:由系统自动分配内存空间,速度较快,但程序员是无法控制的,地址由高向低减少。
2.重载与覆盖的区别
1)方法的覆盖是子类和父类之间的关系,是垂直关系;方法的重载是同一个类中方法之间的关系,是水平关系。
2)覆盖只能由一个方法或者是一对方法产生关系;方法的重载是多个方法之间的关系。
3)覆盖要求参数列表相同;重载要求参数列表不同。
4)覆盖关系中,调用哪个方法体,是根据对象类型(对象对应的存储空间类型)来决定的;重载关系,是根据调用时的参数表与形参表来选择方法的。详细解析
3.进程与线程的区别
答:简单说来,一个程序至少有一个进程,一个进程至少有一个线程。进程是包含了某些资源的内存区域,进程中所包含的一个或多个执行单元称为线程。进程是系统进行资源调度和分配的一个独立单位,线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。进程在执行过程中拥有独立的内存单元,而线程与运行在同一个进程中的线程共享进程中的所有资源。一个线程可以创建和撤销另一个线程,同一个进程中的多个线程可以并发执行。
4.简述 public ,private ,protected,internal的访问权限
答:private : 私有成员, 在类的内部才可以访问。
protected : 保护成员,该类内部和继承类中可以访问。
public : 公共成员,完全公开,没有访问限制。
internal: 在同一命名空间内可以访问。
5.比较页面传值的几种方式
答: 1) 使用QueryString, 如....?id=1; response. Redirect().... ,这种方法的主要优点是实现起来非常简单,然而它的缺点是传递的值是会显示在浏览器的地址栏上的(不安全),同时又不能传递对象,但是在传递的值少而安全性要求不高的情况下,这个方法还是一个不错的方案
2)使用Session变量,Session变量存储过多的数据会消耗比较多的服务器资源,而且喜欢丢值。
3)使用Server.Transfer,使用这种方法是简洁的同时又是面向对象的。
4)Application
5)<input type="hidden"></input>
6)数据库
6.简述什么是委托及其与事件的关系
答:委托类似于函数指针,但函数指针只能引用静态方法,而委托既能引用静态方法,也能引用实例方法,委托不带方法体。事件是一种消息机制,它是委托。当事件发生时,委托就会将事件传递给它的处理方法,由处理方法来结束事件的处理。
7.System.String 和StringBuilder 的区别
答:String的功能已经使得他在处理字符类类型上面应经很完美了。但是在创建大量使用文本数据的程序时,它的效率就显得低了些。.NET字符串的一个非常重要的事实,字符串一旦建立,它的值就将不可再被修改。表面上我们可以给字符串变量任意赋新值,但实际上并没有修改已存在的字符串对象的底层缓存区,而是字符串变量(引用型)指向了新的字符串对象,原先的字符串最终将被垃圾回收掉。StringBuilder:解决了String重复开辟空间对资源的浪费。它提供了对底层缓冲区的直接访问。长度是可变的。创建对象的同时可以指定对象所包含的字符串的初始个数,默认情况容量16。缓冲区会在初始容量不足时实时的调整大小。在许多情况下,应选择System.String表示文本,对多数应用程序来说,可以忽略返回一个修改的字符数据的副本的开销。但是,若创建的是一个文本密集的应用程序(如一个字符处理程序),使用System.Text.StringBuilder的性能要好得多。、
8.DataSet与DataReader的区别
答:DataSet实际上是一个离线数据集,它不用保持数据库连接,而DataReader要保持数据连接。DataSet使用前必须填充,所以必须开辟内存空间存储DataSet中的数据,而DataReader不必在内存中存储所有数据。因此,如果要读取少量数据时使用DataSet可以提升程序的性能,读取大量数据时使用DataReader将比DataSet更加快。DataSet可以对读取的数据进行操作,而DataReader的数据是只读的。
9.抽象类和接口的异同
http://blog.youkuaiyun.com/huang_dannier/archive/2010/04/17/5496268.aspx
10.maching.config与web.config
答:Machine.config 和 Web.config 文件共享许多相同的配置部分和 XML 元素。Machine.config 用于将计算机范围的策略应用到本地计算机上运行的所有 .NET Framework 应用程序。开发人员还可以使用应用程序特定的 Web.config 文件自定义单个应用程序的设置。
11.接口的显式实现与隐式实现的区别
http://www.52net.org/html/_Net_kaifayuyan/C_/20091109/10668.html
12.谈谈你对面向对象的理解
http://baike.baidu.com/view/125370.htm?fr=ala0_1
13.谈谈数据库索引
这个很详细 数据库索引的作用
14.查询100~200条的数据记录
select * from (
select a.*,rownum r from tablea a where r<20)
where r >=10
15.<div>与<span>的区别
答: <div>是一个块级元素,它包围的元素会自动换行,而<span>仅仅是一个行内元素,在它的前后不会换行。<span>没有结构的意义,纯粹是应用样式。<span>可以包含于<div>,反之不成立。
16.浏览器的几个弹出窗口
答:alert,confirm,prompt
17.如何连接两个有序数组
答:其实,我不怕说出来,将两个数组的数据都取出来放到第三个数组中,然后,对数组进行排序。O(∩_∩)O~ 很笨的方法。
18.正则表达式,举例说明。
答: 待续。
19.简述装箱和拆箱
答:将值类型的数据转换为引用类型的数据的过程叫做装箱,反之为拆箱。
20.请说说.net中类和结构的区别。
答:结构和类有大体的语法,但结构受到的限制比类多。结构不能申明有默认的构造函数,因为结构的副本是由编译器创建和销毁的,所以不需要默认的构造函数和析构函数。结构是值类型,所以对结构变量所做的改变不会影响其原值;而类是引用类型,改变其变量的值会改变其原值。申明结构用struct关键字,而申明类用class关键字。向方法传递结构是通过值传递的,而不是通过引用。与类不同,结构的实例化可以不使用new关键字。类可以实现接口。
21.死锁的必要条件?怎么克服?
答:系统的资源不足,进程推进是顺序不合适,资源分配不当。一个资源每次只能被一个进程使用,一个资源请求资源时,而此时这个资源已阻塞,对已获得的资源不放,进程获得资源时,未使用完以前,不能强行剥夺。
22.构造器Constructor是否可以被继承?是否可以被Override?
答:Constructor不可以被继承,因此不能被重写,但可以被重载。
23.是否可以继承String类?
答:因为String类是final类,所以不能被继承。
24.数组有没有length()方法?string 有没有这个方法呢?
答:数组没有length()方法,但是有length属性。string 有这个方法。
25.error和exception的区别
答:error的恢复不是不可能,但是会很困难。exception表示程序正常运行过程中不能发生的情况。
26.谈谈final,finally和finallize的区别。
答:final用于申明属性、方法和类,表示属性不可变,方法不可以被覆盖,类不可以被继承。
finally表示异常处理语句结构中,总是执行的部分。
finallize表示object类的一个方法,在垃圾回收机制中执行时,会调用被回收对象的方法。
27.hashMap和hashtable的区别。
答:hashMap是hashtable的轻量级实现,非线程安全的实现他们都实现了map接口,主要区别是hashMap键值可以为null,效率可以高于hashtable。
28.Collection和Collections的区别。
答:Collection是集合类的上级接口,Collections是针对集合类的一个帮助类,它提供一系列的静态方法来实现对各种集合的搜索、排序和线程安全化操作。
29.用foreach遍历访问的对象需要实现?
答:IEnumerable接口和GetEnumerator()方法。
30.如何理解.net中的垃圾回收机制。
31.什么事Soap?