.Net 面试题目尝试回答

1 什么是.NET?什么是CLI?什么是CLR?IL是什么?JIT是什么?它是如何工作的?GC是什么?简述一下GC的工作方式?

.net的全称是.NET Framework 是一种托管代码的编程模型,采用系统虚拟机运行的编程平台以通用语言运行库(CommonLanguageRuntime)为基础支持多种语言翻译为机器码用于执行。

CLI(Common Language Infrasttuctrue)是CLR的一个子集,也就是Net中最终对编译成MSIL代码的应用程序的运行环境进行管理的那一部分。在CLR结构图中CLI位于下半部分,主要包括类加载器(Class Loader),实时编译器(IL To Native Compilers)和一个运行时环境的垃圾收集器(Garbage Collector)

CLR(Common Language Runtime)是一个刻有多种编程语言使用的运行时,CLR的核心功能(比如内存管理,程序集加载,安全性,异常处理和线程同步)可由面向CLR的所有语言使用,源代码文件通过CLR的编译器将生成四个部分,即PE32或PE32+的头,CLR的头(包括CLR的版本,标记托管模块入口方法),元数据(a 描述源代码中定义的类型和成员 b 描述源代码中引用的类型和成员),以及IL(中间语言),之后CLR将IL编译成CPU指令。PS C++允许编写非托管类型。

JIT(CLR中的一种编译器(JIT[just in time]))在JITCompiler中 1 在负责实现类型的程序集的元数据中查找被调用的方法 2 从元数据中获取该方法的IL 3 分配内存块 4 将IL编译成本地的CPU指令,然后将这些本地代码存储到步骤3分配的内存中5 在Type表中修改与方法对应的记录项,使它只想步骤3分配的内存块 6 跳转到内存块中的本地代码

GC(在托管对分配一个对象时候,可能强制执行一次GC)

2 类和结构的区别是什么?它们对性能有影响么?.NET BCL里有哪些是类(结构),为什么他们不是结构(类)?在定义类型时,您是如何选择类还是结构?

答:结构是值类型而类是引用类型,因为引用类型总是被托管堆分配,则肯定存在以下实时1 内存必须从托管堆分配 2 堆内存分配的每个对象都有一些额外成员,这些成员必须初始化 3 对象的其他字节总是设为0 4 从托管堆分配一个对象时,可能强制一次GC 所以使用值类型和引用类型,对性能影响较大。 BCL中 从System.ValueType派生的int32 bool Decimal TimeSpan DayofWeek 等都是值类型,而其他的类型则是引用类型。有一个原因Int32 Bool等是值类型是因为他们使用较频繁,不需要有堆来分配内存,并在堆存入引入指针地址和索引列表。

3 在.NET 程序运行中,什么是堆,什么是栈?什么情况下会在堆(栈)上分配数据?他们有性能上的区别么?“结构”对象可能分配在堆吗?什么情况下会发生,有什么需要注意的吗?

答:堆的全称是托管堆,而每一个线程创建的时候都将分配一个线程栈,这个栈的空间用于向方法传递实参,并用于方法内部定义局部变量.声明一个变量,类型或者字段的时候会在栈上分配数据,之后通过c#的构造器可以分配堆的数据。性能的影响有一部分体现在GC方面,及在堆上的数据,会通过c#的GC算法(CheckCompress),之后通过代的方式对堆上很久没有使用的内存进行释放。“结构对象”可以在堆上分配内存,这个过程叫做Box 装箱,装箱的过程可以描述为 1 在托管堆中分配好内存。分配的内存量是值类型的各个字段需要的内存量加上托管堆的所有对象都有的两个额外成员(类型对象指针和同步索引块)需要的内存量。 2 值类型的字段复制到新分配的堆内存 3 返回对象的地址。现在,这个地址是对一个对象的引用,值类型现在是一个引用类型(而拆箱的过程就是获取对象指针) 在比如说ArrayList.Add(object value)的类似情况下会发生装箱。(通过ILDasm.exe)来观察代码注意事项

Int32 v =5;

object o = v;  --1 对v进行装箱 将引用指针存储到 o

v=123;

Console.WriteLine(v+","+(Int32)o); --在这个方法里会2次装箱操作 1 对v 进行装箱,并将指针保留到栈上以进行concat(链接操作) 将字符串加载栈上以执行Contact操作  将字符串加载到栈上执行concat操作 对o进行拆箱,获取一个指针,他指向栈上Int32片段 对Int32进行装箱,并将指针保留在栈上进行Concat操作。

如果需要对值类型的实例引用,该实例就必须装箱。将一个值类型的实例传给需要获取一个引用类型的方法,就会发生这种情况。虽然未装箱的值类型没有类型对象指针,但仍可调用由类型类型继承或重写的虚方法,如果没有调用基类的实现,那么就不会装箱,但是如果调用了积累的实现,则被装箱。而GetType或者MemberwiseClone ,都会对值类型进行装箱。

4 异常的作用是什么? .NET BCL中有哪些常见的异常?在代码中您是如何捕获/处理异常的?在catch(ex)中,“throw”和“throw ex”有什么区别?您会如何设计异常结构,什么情况下您会抛出异常?

异常是系统容错和规范程序的不可或缺的重要因素和手段。

BCL中常见的异常有StackOverflowException、OutOfMemoryException、NullReferenceException、IndexOutOfRangeException、ArgumentException、DivideByZeroException等;

捕获异常使用try-catch-finally语句块 ;

"throw"和"throw ex"的区别是:推荐使用throw来抛出异常,因为throw ex会将上次异常清空,又抛出一个新的异常,不利于堆栈跟踪错误源头。

5 List和T[]的区别是什么,平时你是如何选择的?Dictionary<TKey,TValue>是做什么的?.NET BVL中还有哪些常用的容器?他们分别是如何实现的(哪种数据结构)?分别适用于哪些场景?

List<T>长度不固定,动态变化,支持方法较多;T[]固定大小的泛型数组。

Dictionary<TKey, TValue>是泛型字典,提供一对一的关系;

.Net BCL中常用的集合有Stack<T>、Queue<T>、LinkedList<T>,对应的数据结构是栈、队列和链表。

6 抽象类和接口有什么区别?使用时有什么需要注意的么?如何选择是定义一个“完全抽象”的抽象类,还是接口?什么是接口的“显式实现”?为什么说它很重要?

答:相同点:都不能被实例化,都可以通过继承实现其抽象方法;

不同点:接口支持多继承,抽象类不能;接口只能定义行为,抽象类既可以定义行为,还能提供实现;接口只包含方法、属       性、索引器和事件的签名,不能包括自定义字段和实现方法,抽象类可以包含自定义字段和实现方法。

7 字符串是引用类型还是结构类型?他和普通的应用类型相比有什么特别的地方么?使用字符串时有什么需要注意的地方?为什么说StringBuilder比较高效?在链接字符串时,他无论何时都比直接相加更高效么?

字符串是特殊的引用类型。

其特殊之处在于string是不可变的,即字符串恒定性(Immutability),字符串一经创建,就不可改变。

当大量使用string进行拼接的时候,直接使用string+会影响效率,使用StringBuilder更为合适;

不是的,对于简单的字符串连接操作,在性能上StringBuilder不一定总是优于String,因为StringBuilder对象的创   建代价比较大,在字符串连接目标较少的情况下,过度滥用StringBuilder会导致性能的浪费而非节约。只有大量的或者无法预知次数的字符串操作,才考虑以StringBuilder实现。

8 如何高效的进行数组复制?“二维数组和数组内数组有什么区别”?在使用双重循环遍历一个二维数组时,如何选择内外层的遍历顺序?

9 什么是元编程,.NET有哪些元编程的手段和场景?什么是反射?能否举一些反射的常用场景?有人说反射性能较差,您怎么看待这个问题?有什么办法可以提高反射的性能么?

元编程是对程序本身的编程,如反射;

程序集包含模块,模块又包含类型,类型下有成员,反射就是管理程序集、模块、类型的对象,它能够动态的创建类,获   取现有对象的类型,能调用类型的方法和访问类型的字段属性。它是在程序运行时创建和使用类型的。

10 委托是什么?匿名方法是什么?在C#3.0 中 lambda表达式是什么?扩展方法是什么?LINQ是什么?您觉得在C#3.0中还有哪些重要的特性,他们带来什么优势?BCL中哪些类库和这些特性有关?您平时工作最常用哪些?

委托是指向函数的指针;匿名方法类似javascript中的匿名方法,无须声明,直接使用;

Lambda表达式函数式编程,LINQ表示语言集成查询,为CLR提供了信息查询能力。

扩展方法,用this关键字标记扩展方法的第一个参数,且该参数不能为指针类型。

.Net 面试题目尝试回答

时间: 2024-08-02 14:07:27

.Net 面试题目尝试回答的相关文章

2019最新Android中级面试题目汇总解答

注:因为实际开发与参考答案会有所不同,再者怕误导大家,所以这些面试题答案还是自己去理解!面试官会针对简历中提到的知识点由浅入深提问,所以不要背答案,多理解. Android进阶延伸点 1.如何进行单元测试,如何保证App稳定 ? 参考回答: 要测试Android应用程序,通常会创建以下类型自动单元测试 本地测试:只在本地机器JVM上运行,以最小化执行时间,这种单元测试不依赖于Android框架,或者即使有依赖,也很方便使用模拟框架来模拟依赖,以达到隔离Android依赖的目的,模拟框架如Goog

HTML5面试题目汇总(二)

HTML5面试题目汇总(二) 标签: javascript 2016-07-19 10:15 639人阅读 评论(0) 收藏 举报  分类: javascript(16)  1.怎样添加.移除.移动.复制.创建和查找节点? 1)创建新节点 createDocumentFragment() //创建一个DOM片段 createElement() //创建一个具体的元素 createTextNode() //创建一个文本节点 2)添加.移除.替换.插入 appendChild() //添加 remo

android面试题目

最近才开的博客,希望大家多多关注,andorid开发也做了3年有余了,也面试多家企业,借此机会分享一下,我们中遇到过的问题以及解决方案吧,希望能够对正在找工作的andoird程序员有一定的帮助.学完<andorid从零开始教程>+面试题目全理解,年薪20w以上绝对没问题. 特别献上整理过的50道面试题目 1.listView的优化方式 重用convertView viewHolder static class viewHolder 在列表里面有图片的情况下,监听滑动不加载图片 多个不同布局,可

C语言经典面试题目(转的,不过写的的确好!)

第一部分:基本概念及其它问答题 1.关键字static的作用是什么? 这个简单的问题很少有人能回答完全.在C语言中,关键字static有三个明显的作用: 1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变. 2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问.它是一个本地的全局变量. 3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用.那就是,这个函数被限制在声明它的模块的本地范围内使用. 大多

Java高概率面试题目—finally

在Java面试中关于finally的面试题目出现的概率非常高,而且一旦面试官问起绝不会是蜻蜓点水,而是会向你发起层层递进地“连环问”,并且回答这系列问题常常需要代码的辅助,可谓考验基础的面试利题.究竟面试官会问些什么呢?应试者又该怎样完美回答呢?今天小编就带着猿猿们亲身体验一场finally面试,希望对你有帮助. 面试官题目 什么时候用到finally呢?finally语句在try或catch中的return语句执行之后,还是return返回之前执行呢? 考点分析 这个题目也是考查异常相关的.对

PYTHON 一些基础面试题目总结

PYTHON 一些基础面试题目总结http://www.bieryun.com/1191.html 1.       Python是如何进行内存管理的? 答:从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制 一.对象的引用计数机制 python内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用计数. 引用计数增加的情况: 1,一个对象分配一个新名称 2,将其放入一个容器中(如列表.元组或字典) 引用计数减少的情况: 1,使用del语句对对象别名显示的销毁 2,引用超出作

0- 26个面试经典问题回答

面试技巧:26个面试经典问题回答 1.请你自我介绍一下自己好吗? ? 回答提示:一般人回答这个问题过于平常,只说姓名.年龄.爱好.工作经验,这些在简历上都有.其实,企业最希望知道的是求职者能否胜任工作,包括:最强的技能.最深入研究的知识领域.个性中最积极的部分.做过的最成功的事,主要的成就等,这些都可以和学习无关,也可以和学习有关,但要突出积极的个性和做事的能力,说得合情合理企业才会相信.企业很重视一个人的礼貌,求职者要尊重考官,在回答每个问题之后都说一句"谢谢",企业喜欢有礼貌的求职

美资软件公司JAVA工程师电话面试题目

面试必备基础题目(虽然不一定常用, 仅用于面试, 面试就是把人搞的都不会然后砍价, 当然您可以讲我可以查资料完成, 但是面试的时候就是没道理的, 起码我是经常看到这些题). 如何把一段逗号分割的字符串转换成一个数组?request.getAttribute() 和 request.getParameter() 有何区别?response.sendRedirect() 和 forward() 区别?<%@include file="xxx.jsp"%>和 <jsp:in

Java面试题目整理

一.引言:本文主要整理遇到的面试题目,以及提供自己的见解,将会持续更新,如有问题,可评论交流,一起进步. 二.问题及我的见解: 1. n个结点可以组合成多少棵不同的二叉树? 答:2^n-n棵 2. 什么是bean? 答: bean本质上就是可复用的类,比如在spring中的bean就是表示组件的意思. 3. String.StringBuffer.StringBuilder的有什么区别? 答:String是内容和长度固定的类 StringBuffer是内容和长度可变的类,并且线程安全 Strin