net高级工程师面试题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
软件工程师面试题
基础题:
1.简述string[]、ArrayList、List的区别。
数组:
优点:
o数组在内存中是连续存储的,索引速度非常快;
o赋值和修改元素也很简单;
不足:
o两个数据之间插入数据比较麻烦;
o声明数组的时候,必须指明数组的长度,数组长度过长会
造成内存浪费,数组的长度过短,会造成数据溢出错误。
ArrayList:
优点:
o framework 提供的用于数据存储和检索的专用类
o大小依据存储的数据来动态扩展和收缩
o继承IList,可以方便的进行数据的添加、插入和删除缺点:
o允许插入不同类型的数据,都当做object类型处理
o数据处理时可能出现类型不匹配的错误
o存在装箱(值=》引用)拆箱的操作,会带来很大的性能
损耗
List:
优点:
o声明List集合时,需要声明集合内数据的对象类型
o避免了类型安全问题和装箱拆箱的性能问题
2.简述装箱和拆箱操作中的性能损耗是如何产生的。
3.简述对中的事件机制的理解。
4.在一个的三层结构系统中,以登录操作为例,简述在各层中如何组织代码。
5.简述相比DATASET,实体类在WEB项目中的优点与缺点。
6.简述GC是如何工作的。
Java采用VM(Virtual Machine)机制,由VM来管理程序的运行当然也包括对GC管理。90年代末期.NET出现了,.NET采用了和Java类似的方法由CLR(Common Language Runtime)来管理。Garbage Collector(垃圾收集器,在不至于混淆的情况下也成为GC)以应用程序的root为基础,遍历应用程序在Heap上动态分配的所有对象[2],通过识别它们是否被引用来确定哪些对象是已经死亡的、哪些仍需要被使用。已经不再被应用程序的root或者别的对象所引用的对象就是已经死亡的对象,即所谓的垃圾,需要被回收。这就是
GC工作的原理。为了实现这个原理,GC有多种算法。比较常见的算法有Reference Counting,Mark Sweep,Copy Collection等等。目前主流的虚拟系统.NET CLR,Java VM和Rotor都是采用的Mark Sweep算法。
Java的内存管理实际就是对象的管理,其中包括对像的分配和释放。对于程序员来说,分配对象使用new关键字,释放对象时只是将对象赋值为null,让程序员不能够再访问到这个对象,该对象被称为“不可达”。GC将负责回收所有“不可达”对象的内存空间。
根据GC的工作原理,可以通过一些技巧和方式让GC运行更快,高效而又合理。编程建议如下:
o尽早释放无用对象的引用,特别注意一些复杂对象,如数
组,队列等。对于此类对象,GC回收它们的效率一般较
低,如果程序允许,应尽早将不用的引用对象赋为null,
这样可以加速GC的工作。
o尽量少用finalize函数。finalize是java提供给程序员用
来释放对象或资源的函数,但是它会加大GC的工作量,
因此尽量少采用finalize函数回收资源。当程序有一定
的等待时间,程序员可以手动执行(),通知GC运行,但是
java语言规范并不保证GC一定会执行。
.NET的GC机制有这样两个问题:
o首先,GC并不是能释放所有的资源。它不能自动释放
非托管资源。
o第二,GC并不是实时性的,这将会造成系统性能上的
瓶颈和不确定性。
o GC并不是实时性的,这会造成系统性能上的瓶颈和不
确定性。所以有了IDisposable接口,IDisposable接口
定义了Dispose方法,这个方法用来供程序员显式调用
以释放非托管资源。使用using语句可以简化资源管理
7.简述3个熟悉的设计模式。
简单工厂模式(只适用于业务简单的情况):有三种角色组成:
•工厂类角色(只有一个工厂类)
•抽象产品角色
•具体产品角色
工厂方法模式(当产品种类非常多时会出现大量与之对应的工厂类):有四种角色
•抽象工厂角色
•具体工厂角色
•抽象产品角色
•具体产品角色
简单工厂和工厂方法结合能够减少工厂类。使用这两种模式能够提高扩展性和维护性
抽象工厂模式(需要创建的对象比较复杂):
满足条件:
•系统中有多个产品族,而系统一次只可能消费其中一族产
品
•同属于同一个产品族的产品一起使用时。
组成角色:
•抽象工厂角色
•具体工厂角色
•抽象产品角色
•具体产品角色
8.简述UDP协议特点,以及如何提高UDP传输可靠性。
9.简述.,.,.各版本中推出的新特性。
10.const和readonly的区别
我们都知道,const和static readonly的确很像:通过类名而不是对象名进行访问,在程序中只读等等。在多数情况下可以混用。二者本质的区别在于,const的值是在编译期间确定的,因此只能在声明时通过常量表达式指定其值。而static readonly是在运行时计算出
其值的,所以还可以通过静态构造函数来赋值。明白了这个本质区别,我们就不难看出下面的语句中static readonly和const能否互换了:
1. static readonly MyClass myins = new MyClass();
2. static readonly MyClass myins = null;
3. static readonly B = 10; static readonly A = B * 20;
4. static readonly int [] constIntArray = new int[] {1, 2, 3};
5. void SomeFunction()
{
const int a = 10;
...
}
static string astr="abcd";
private const string str = astr+"efg";
1:不可以换成const。new操作符是需要执行构造函数的,所以无法在编译期间确定
2:可以换成const。我们也看到,Reference类型的常量(除了String)只能是Null。
3:可以换成const。我们可以在编译期间很明确的说,A等于200。4:不可以换成const。道理和1是一样的,虽然看起来1,2,3的数组的确就是一个常量。
5:不可以换成readonly,readonly只能用来修饰类的field,不能修饰局部变量,也不能修饰property等其他类成员。