.net面试题及答案
.net程序员在求职面试中,学会做好面试准备很重要,那么你了解面试题及答案了吗?下面小编已经为你们整理了.net面试题及答案,希望可以帮到你。
.net面试题及答案(一)
1.JIT是什么,它是如何工作的?GC是什么,简述一下GC的工作方式?
JIT:Just in time,C#或者是VB.NET的代码首先被编译为IL存储在本地,当要运行这些代码的时候,CLR对IL进行第二次编译转换成机器码运行。好处:可移植性,而且IL在加载到内存中时将受到类型安全性方面检查,这实现了更好的安全性和可靠性。
GC:垃圾回收(garbage collection),是根据程序的需要自动分配和回收内存的过程。垃圾回收器处理的是引用对象,而且只回收堆上的内存。这意味着假如维持对一个对象的引用,就会阻止GC重用对象使用的内存。在.NET中,垃圾回收器采用的是mark-and-compact算法。在一次垃圾回收周期开始的时候,它要识别对象的所有跟引用,根据这个引用可以遍历每个根引用所标识的一个树形结构,并递归确定所有引用指向的对象。这样一来,垃圾回收器就可以识别所有可达的对象,在执行回收的时候,GC不是枚举所有访问不到的对象,相反,通过压缩所有相邻的可达的对象来执行垃圾回收。不可访问的对象就会被覆盖。垃圾回收的宗旨是提高内存的利用率,它并不是用来清理文件句柄,和数据库连接字符串,端口或者其他有限的资源(终接器finalizer,不能被显示调用,不能传递任何参数,即不能被重载,只有垃圾回收器才能调用终接器,使用Using语句进行确定性终结
2.类(class)和结构(struct)的区别是什么?它们对性能有影响吗?
01. 值类型与引用类型
结构是值类型:值类型在栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,通过使用结构可以创建更多的值类型
类是引用类型:引用类型在堆上分配地址堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用
注:1.虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object
2.虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用
02.继承性
结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed .
类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承注:虽然结构不能被继承 可是结构能够继承接口,方法和类继承接口一样
03.内部结构:
结构: 没有默认的构造函数,但是可以添加构造函数没有析构函数没有 abstract 和 sealed(因为不能继承)不能有protected 修饰符可以不使用new 初始化在结构中初始化实例字段是错误的
类: 有默认的构造函数 有析构函数 可以使用 abstract 和 sealed 有protected 修饰符
必须使用new 初始化
.net面试题及答案(二)
1.什么是元编程,.NET有哪些元编程的手段和场景?什么是反射?能否举一些反射的常用场景?有人说反射性能较差,您怎么看待这个问题?有什么办法可以提高反射的性能吗?
学着做OA的时候,动态加载不同的DataProvider(Oracle和Sqlserver),方便,可以随时替换不用重新编译程序
2.委托是什么?匿名方法是什么?在C# 3.0中,Lambda表达式是什么?扩展方法是什么?LINQ是什么?您觉得C# 3.0中还有哪些重要的特性,它们带来了什么优势?BCL中哪些类库和这些特性有关?您平时最常用哪些?
委托可以把一个方法作为参数代入另一个方法。
委托可以理解为指向一个函数的指针。
匿名方法:就是没有实际方法声明的委托实例。或者说,它们的定义是直接内嵌在代码中的。
Lambda表达式:是比匿名方法更加简洁的一种匿名函数语法
委托和事件没有可比性,因为委托是类型,事件是对象,下面说的是委托的对象(用委托方式实现的事件)和(标准的event方式实现)事件的区别。事件的内部是用委托实现的。因为对于事件来讲,外部只能“注册自己+=、注销自己-=”,外界不可以注销其他的注册者,外界不可以主动触发事件,因此如果用Delegate就没法进行上面的控制,因此诞生了事件这种语法。事件是用来阉割委托实例的,类比用一个自定义类阉割List。事件只能add、remove自己,不能赋值。事件只能+=、-=,不能= 。事件内部就是一个private的委托和add、remove两个方法。
3.工作之外您看哪些技术相关的书、网站、社区、项目等等?
您还接触哪些.NET以外的技术,能和.NET或.NET中有针对性的部分做个对比吗?
C#本质论,SQL Server2008实战,数据结构,ASP.NET揭秘,Javascript深入浅出
4.website和webapplication的区别
1)website修改后不需要重启即可看到效果,webapplication需要
2)website不分namespace,webapplication有namespace
3)website为了兼容asp转过来的开发人员习惯
4)没有技术上的区别,调试习惯不同
5)website为每个编译为一个dll,webapplication生成一个dll
6)不利于工程开发,比如代码出错不容易发现
.net面试题及答案(三)
1.异常的作用是什么?.NET BCL中有哪些常见的异常?在代码中您是如何捕获/处理异常的?在“catch (ex)”中,“throw”和“throw ex”有什么区别?您会如何设计异常的结构,什么情况下您会抛出异常?
(1)C# 语言的异常处理功能可帮助您处理程序运行时出现的任何意外或异常情况
(2)throw会保留堆栈信息。throw ex 不会。当然,如果你抛出新的异常之前设置innerException的话,可以通过innerException的堆栈访问原有的堆栈。
(3)靠异常才能发现错误的,通过try catch finally来捕获异常。如果是未预料到的则不处理(内存不足,删除文件)直接报错更容易发现错误catch块从最具体到常规排列
2.List<T>和T[]的区别是什么,平时你如何进行选择?Dictionary<TKey, TValue>是做什么的?.NET BCL中还有哪些常用的容器?它们分别是如何实现的(哪种数据结构)?分别是适用于哪些场景?
01.List<T>arrylist的泛型版本,大小是可变的,T[]继承自Array,大小是固定的。如果大小没有怎么变化,选择T[],一般情况下选择List<T>
02.Dictionary是hashtable的泛型版本,用来存储键值对的.例如:sortlist,stack等
3.抽象类和接口有什么区别?使用时有什么需要注意的吗?
如何选择是定义一个“完全抽象”的抽象类,还是接口?什么是接口的“显式实现”?为什么说它很重要?
相同点:都不能被直接实例化,都通过继承实现其抽象方法
不同点:
(1) 接口支持多继承;抽象类不能实现多继承。
(2) 接口只能定义行为;抽象类既可以定义行为,还可能提供实现。
(3) 抽象类允许包含实现的virtual成员,所以能为派生类成员提供一个默认的实现,而接口所有的成员自动成为virtual成员,而且不能包含任何实现
4.字符串是引用类型类型还是结构类型? 引用类型
它和普通的引用类型相比有什么特别的地方吗?不可变的
使用字符串时有什么需要注意的地方?为什么说StringBuilder比较高效?
当拼接两个字符串时,系统先是把两个字符串写入内存,接着删除原来的String对象,然后创建一个String对象,并读取内存中的数据赋给该对象。这一来二去的,耗了不少时间。而使用System.Text命名空间下面的StringBuilder类就不是这样了,它提供的Append方法,能够在已有对象的原地进行字符串的修改,简单而且直接。
在连接多个字符串时,它无论何时都比直接相加更高效吗?
不一定,在1000个字符以内效果一样,达到10000时StringBuilder类的效率会显著提升
如何高效地进行数组复制?“二维数组”和“数组的数组”有什么区别?
数组复制的方法:for CopyTo() 静态CopyTo() Clone
看了“.net面试题及答案”