当前位置:文档之家› .net高级工程师面试题

.net高级工程师面试题

.net软件工程师面试题基础题:1.简述string[]、ArrayList、List的区别。

数组:优点:o数组在内存中是连续存储的,索引速度非常快;o赋值和修改元素也很简单;不足:o两个数据之间插入数据比较麻烦;o声明数组的时候,必须指明数组的长度,数组长度过长会造成内存浪费,数组的长度过短,会造成数据溢出错误。

ArrayList:优点: 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函数回收资源。

当程序有一定的等待时间,程序员可以手动执行System.gc(),通知GC运行,但是java语言规范并不保证GC一定会执行。

.NET的GC机制有这样两个问题:o首先,GC并不是能释放所有的资源。

它不能自动释放非托管资源。

o第二,GC并不是实时性的,这将会造成系统性能上的瓶颈和不确定性。

o GC并不是实时性的,这会造成系统性能上的瓶颈和不确定性。

所以有了IDisposable接口,IDisposable接口定义了Dispose方法,这个方法用来供程序员显式调用以释放非托管资源。

使用using语句可以简化资源管理7.简述3个熟悉的设计模式。

简单工厂模式(只适用于业务简单的情况):有三种角色组成:•工厂类角色(只有一个工厂类)•抽象产品角色•具体产品角色工厂方法模式(当产品种类非常多时会出现大量与之对应的工厂类):有四种角色•抽象工厂角色•具体工厂角色•抽象产品角色•具体产品角色简单工厂和工厂方法结合能够减少工厂类。

使用这两种模式能够提高扩展性和维护性抽象工厂模式(需要创建的对象比较复杂):满足条件:•系统中有多个产品族,而系统一次只可能消费其中一族产品•同属于同一个产品族的产品一起使用时。

组成角色:•抽象工厂角色•具体工厂角色•抽象产品角色•具体产品角色8.简述UDP协议特点,以及如何提高UDP传输可靠性。

9.简述.NET2.0,.NET3.0,.NET3.5各版本中推出的新特性。

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;...}6.private 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等其他类成员。

6.错误:如果在astr前加上const或者const改为readonly即可;总结:1.const、readonly和static readonly定义的常量,指定初始值后(包括在构造函数内指定的初始值) 将不可更改,可读不可写;2.const定义时必须指定初始值,而readonly定义时可以不进行初始化(MS建议在定义时初始值),同时也可以在构造函数内指定初始值,并以构造函数内指定的值为准;3.const和static readonly定义的常量是静态的,只能由类直接访问;而readonly 定义的常量是非静态的,只能由实例对象访问;4.static readonly常量,如果在构造函数内指定初始值,则必须是静态无参构造函数;5.const是编译时常量,readonly是运行时常量;cosnt较高效,readonly较灵活。

在应用上以static readonly代替const,以平衡const在灵活性上的不足,同时克服编译器优化cosnt性能,所带来的程序集引用不一致问题;算法题:(以下三题不用作答,想好思路面试谈即可)1. 一个整数数列,元素取值可能是0~65535中的任意一个数,相同数值不会重复出现。

0是例外,可以反复出现。

请设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相邻。

注意:- 5个数值允许是乱序的。

比如:8 7 5 0 6- 0可以通配任意数值。

比如:8 7 5 0 6 中的0可以通配成9或者4- 0可以多次出现。

- 复杂度如果是O(n2)则不得分。

解题思路:1.取5个数中非0的最大数和最小数,之差不大于4则连续,否则不连续。

2.要增加两个特例:1)全0 算连续,2)只有一个非0算连续代码实例[java]view plain copyprint?1.<span style="font-size:14px;"><span style="font-family:Microsoft YaHei;font-size:12px;color:#333333;"><span style="font-size:12px;">#include<iostream>2.#include<stdlib.h>ing namespace std;4.5.int check(int arry[5])6.{7.int max=0,min=65535;8.int zerocount=0;9.for(int i=0;i<5;i++)10. {11.if(arry[i]==0)12. zerocount++;13.else14. {15.if(arry[i]>max)16. max=arry[i];17.if(arry[i]<min)18. min=arry[i];19. }20. }21.if(zerocount>=4)22.return1;23.else24. {25.if(max-min<=4)26.return1;27.else28.return0;29. }30.}31.32.int main()33.{34.int arry[5];35. cout<<"一个整数数列,元素取值可能是0~65535中的任意一个数,相同数值不会重复出现;0是例外,可以反复出现"<<endl;36.for(int i=0;i<5;i++)37. cin>>arry[i];38.int p=check(arry);39.if(p)40. cout<<"连续"<<endl;41.else42. cout<<"不连续"<<endl;43. system("pause");44.} </span></span></span>输入:1 2 3 0 5输出:连续2. 设计一个在一百万个数字中求十个最大的数算法[java]view plain copyprint?1.<span style="font-size:14px;"><span style="font-family:Microsoft YaHei;font-size:12px;color:#333333;"><span style="font-size:12px;">int data[M];2.int top[N + 1];3.4.5.void top_N()6.{7. top[0] = std::numeric_limits<int>::max(); // Set a "guard" on the boundary to reduce comparision times.8.for (int i = 1; i <= N; ++i) top[i] = std::numeric_limits<int>::min();9.for (int j = 0; j < M; ++j)10. {11.for (int k = N; top[k] < data[j]; --k) top[k] = top[k - 1];12. top[k + 1] = data[j];13. }14.}</span></span></span>3. 有如下输入:若干个由大写英文字母构成的单词,以’,’号隔开。

相关主题