2024年1月8日发(作者:)

net软件工程师面试题

根本题:

1. 简述string[]、 ArrayList、 List的 区别。

数组:

利益 :

o

数组在内存中是 接连存储的 , 索引速度十分快;

o

赋值和修改元素也很简单;

不足:

o

两个数据之间插入数据对照贫穷困难;

o

声明数组的 时辰, 必须指明数组的 长度, 数组长渡过长会造成内存挥霍,

数组的 长渡过短, 会造成数据溢犯错误。

ArrayList:

利益:

o

. net framework 提供的 用于数据存储和检索的 专用类

o

大小依据存储 的 数据来动态扩展和收缩

o

继承IList, 可以方便的 进行数据的 添加、 插入和删除

瑕玷:

o

许可插入差别类型的 数据, 都当做object类型处理

o

数据处理时大概出现类型不匹配的 错误

o

存在装箱(值=》 引用) 拆箱的 操纵, 会带来很大的 性能损耗

List:

利益:

o

声明List集合时, 需要声明集合内数据的 对象类型

o

避免了类型安然问题和装箱拆箱的 性能问题

2. 简述装箱和拆箱操纵中的 性能损耗是 若何产生的 。

3. 简述对ASP. NET中的 事务机制的 懂得。

4. 在一个ASP. NET的 三层结构系统中, 以登录操纵为例, 简述在各层中若何组织代码。

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 copy

print?

1. #include

2. #include

3. using 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. else

14. {

15. if(arry[i]>max)

16. max=arry[i];

17. if(arry[i]

18. min=arry[i];

19. }

20. }

21. if(zerocount>=4)

22. return 1;

23. else

24. {

25. if(max-min<=4)

26. return 1;

27. else

28. return 0;

29. }

30. }

31.

32. int main()

33. {

34. int arry[5];

35. cout<<"一个整数数列, 元素取值大概是 0~65535中的 随意率性一个数, 相同数值不会重复出现;0是 破例, 可以反复出现"<

36. for(int i=0;i<5;i++)

37. cin>>arry[i];

38. int p=check(arry) ;

39. if(p)

40. cout<<"接连"<

41. else

42. cout<<"不接连"<

43. system("pause") ;

44. }

输入: 1 2 3 0 5

输出: 接连

2. 设计一个在一百万个数字中求十个最大的 数算法

[java] view plain copy

print?

1. int data[M];

2. int top[N + 1];

3.

4.

5. void top_N()

6. {

7. top[0] = std::numeric_limits::max() ; // Set a "guard" on the boundary to reduce comparision times.

8. for (int i = 1; i <= N; ++i) top[i] = std::numeric_limits::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. }

3. 有如下输入: 若干个由大写英文字母构成的 单词, 以’, ’号隔开。 如“ABCCD, CDA,

BCDD, DCA, ADC, BCD, CDCAB”。 写一段程序, 从输入中寻找由相同字符构成(重复字符出现次数也是 一样) 的 单词组输出。

如以上输入, 则输出:

第1组: ABCCD, CDCAB

第2组: CDA, DCA, ADC

[java] view plain copy

print?

1. string s = "ABCCD,

CDA, BCDD, DCA, ADC, BCD, CDCAB";

2. var query = s. Split(', ') . GroupBy(x => x. OrderBy(y => y) ) ;

3. foreach (var item in query)

4. Console. WriteLine(string. Join(", ", item.

ToArray() ) ) ;

项目&经管: (以下两题不用作答, 想好思路面试谈即可)

1. 假定你做为一个开发团队的 领导者, 经由长时间的 磨合, 有了一只10人左右的 不错的 团队。 其中每个成员都在其职位上有不可或缺的 作用。 现因为一些缘故, 需要你辞退其中一人。 你会如那边理这件事情?

2. 有一套公司自己开发供本公司使用的 CRM系统, 其中的 权限控制过于简单。 现需要你从头设计其权限系统, 你会若何开展这个工作?

1、 文件路径文本转换 编写一个函数, 输入参数:

·页面文件的 虚拟路径(string pageVirPath, 例如: ~/abc/def/page. aspx)

·图片文件的 虚拟路径(string imgVirPath, 例如: ~/ghi/image/pic . gif)

处理: 计算出图片文件相对页面文件的 相对路径, 例如: . . /. . /ghi/image/ pic . gif

返回: 相对路径

要求:

a、 不要求严厉的 C#语言表述, 可恰当使用伪码, 着重要表达清楚处理逻辑;

b、 尽量使用正则表达式

2、 DataTable内数据转换 编写一个函数, 输入参数:

·源数据表(DataTable srcTable) , 该表中已包含int型数据列”isSys”, 数据为 0

或-1,

处理: 直接处理源数据表, 将”isSys” 数据列替换为string型的 ”系统” 数据列,

当”isSys” 列中值为0, 则”系统” 列值为空字符串,

当”isSys” 列中值为-1, 则”系统” 列值为”系统”。

返回: 操纵是 否成功(bool) ;

要求:

a、 不要求严厉的 C#语言表述, 可恰当使用伪码, 着重要表达清楚处理逻辑;

b、 不抛出任何反常(包罗. net反常)

设计模式面试题:

1, Windows Media Player和RealPlayer是 常用的 媒体播放器, 它们的 API结构和调用方式十分差别, 此刻你的 应用需要同时撑持调用这2种播放器的 API。 你要怎么设计?

2, 此刻有一种空调, 它撑持3种模式: Hot Air, Cool Air 和DoNothing。 例如, 当挑选Hot Air模式时, 再挑选温度为20度, 空调将输送热风;挑选 Cool Air模式, 温度设置为20度时, 将输送冷风;在挑选DoNothing模式时, 空调什么都不做。 你将思量若何为空调设计应用程序?参加未来空调需要增添撑持新的 模式呢?

一、 第一题的 解: 适配器模式+抽象工厂模式

我采纳了抽象工厂模式+适配器模式, 先上图:

设计的 重点是 :

1, 起首看适配器模式。 MediaPlayerClassA和RealPlayerClassA都实现了IMediaA接口。 MediaPlayerClassA调用MediaPlayer的 APIs来实现IMediaA接口定义的 功能;RealPlayerClassA则调用RealPlayer APIs。

2, 再来看抽象工厂模式。 MediaPlayerFactory和RealPlayerFactory继承自抽象类MediaFactory类, MediaPlayerFactory用来创建MediaPlayer产物族;RealPlayerFactory用来创建RealPlayer产物族。 固然上图中只画出了IMediaA接口, 但事实上我们大概需要实现多个接口如IMediaB, IMediaC等, 这就是 这里为什么使用抽

象工厂模式。

3, 抽象类MediaFactory实现了一个静态方式CreateFactory, 用来创建具体工厂, 该方式返回MediaFactory类型的 对象给Client, 如许, Client不就需要知道它操纵的 是

那个具体工厂。 CreateFactory方式采纳反射技术, 如许, 不需要修改CreateFactory方式的 代码, 就可以撑持以后添加新的 具体工厂。

4, 工厂类返回IMediaA接口给Client, Client操纵IMediaA接口而不需要知道它具体使用的 是 MediaPlayerClassA仍是 RealPlayerClassA的 实例。

序列图如下:

二、 第二题的 解: Flyweight模式

我采纳了Flyweight(桥梁) 模式, 先上图:

设计的 重点是 :

1, 把AirConditioner和它撑持的 Model分脱离来, 在AirConditioner类的 实例中保留它撑持的 所有Model类的 实例, 如许做的 益处是 1) 参加只是 撑持的 Model有转变, 不需要去实现新的 AirConditioner类, 只要添加或删除撑持的 Model即可。 2) 多个差别的 AirConditioner类可以方便地共享共同的 Model类, 否则, 大概需要复杂的

继承关系才能在差别AirConditioner类之间共享Model。 事实上, AirConditioner类和Model类的 关系十分类似于桥梁模式中抽象类和实现类的 关系。

2, 采纳Flyweight模式。 在多个AirCondition实例中, 共享Model的 实例, 如许可以大大地节流存储空间。 ModelFactory用于创建Model实例并返回给AirCondition, 它保留了一个Model池, 每种类型的 Model只有一个实例。 在Model类中只保留内蕴状态, AirConditioner类保留外蕴状态, 调用Model类的 Execute方式时, 需要把IAirConditioner作为外蕴状态传递给方式(大概也可以使用专门的 状态类作为外蕴状态) 。

序列图如下:

数据库根本面试题

1. 教师号 星期号 是 否有课

1 2 有

1 3 有

2 1 有

3 2 有`

1 2 有

写一条sql语句让你变为如许的 表

教师号 星期一 星期二 星期三

1 2 1

2 1

3 1

各星期下的 数字示意: 对应的 教师在星期几已经排的 课数

T-SQL实现:

[sql] view plain copy

print?

1. CREATE TABLE COURSE_test (

2. "教师号" INT,

3. "星期号" INT ,

4. "是 否有课" nvarchar(20)

5. )

6.

7. insert into COURSE_test

8. VALUES(1, 2, '有') ;

9.

10. select 教师号,

11. count(case when(星期号=1) AND (是 否有课='有') then 教师号 else null end) as 星期一,

12. count(case when(星期号=2) AND (是 否有课='有') then 教师号 else null end) as 星期二,

13. count(case when(星期号=3) AND (是 否有课='有') then 教师号 else null end) as 星期三

14. from COURSE_test

15. group by 教师号

运行select语句成果如下:

非技术(面谈) :

1. 在上份工作中, 自己表现最大的 利益和瑕玷是 什么。