.net面试题2

> 什么是.NET?什么是CLI?什么是CLR?IL是什么?JIT是什么,它是如何工作的?GC是什么,简述一下GC的工作方式?
 
CLI是规范; CLR是对CLI的实现; .NET是基于CLR构建的一套框架;
开发人员需要通过IL与CLR进行交流, 虽然IL本身支持一些面向对象的概念, 但是对于开发人员来讲还是过于复杂低效, 于是C#应运而生, 程序员只需编写C#代码, csc编译器会将其翻译成IL;
虽然CLR理解IL, 但是CPU只认识二进制指令, 所以CLR需要JIT的帮助, 将IL翻译成CPU指令. JIT按需工作, 当一个.NET方法即将被执行时, JIT会介入, 把该方法(IL指令) 编译成CPU指令, 并保存以供重用.
GC被用来回收当前进程中已无人使用的垃圾对象; GC会被某些事件触发(比如, 0代对象满, 内存压力大, appdomain被卸载), 随后遍历GC堆上的对象, 并通过”该对象是否被root直接/间接引用 (更进一步, “一个对象是否可以被回收”还会依赖于F-Reachable Queue 和GC Handle Table”)来判断一个对象是否需要被回收. 具体细节还这真不是半个小时能讲完的J
 
> 类(class)和结构(struct)的区别是什么?它们对性能有影响吗?.NET BCL里有哪些是类(结构),为什么它们不是结构(类)?在自定义类型时,您如何选择是类还是结构?
 
简单说来, 类是引用类型, 结构是值类型;
值类型对象直接分配在当前线程的栈上, 引用类型对象位于GC堆上, 所以值类型对象无法在多个方法中传递, 而引用类型会承担更多的任务, 比如, 用于线程同步 (Monitor.Enter(…))当一个引用类型的对象被创建时, 会需要4+4=8个byte的额外空间开销(32bit OS), 同时过度的使用引用类型对象会增加GC堆的压力, 频繁的GC对程序的性能还是有一些影响的.
BCL中的Byte类型是一个结构体, 至于为什么它不是一个类, 我觉得可能是设计者认为Byte不应该被继承, 或者8个byte的额外开销无法承受吧.
 
什么时候使用值类型/引用类型还是应当具体情况具体分析, 个人倾向引用类型, 因为这样在设计的时候会少费些脑子, 不过能用sealed就sealed, 在方法调用时开销会小一些.
 
> 在.NET程序运行过程中,什么是堆,什么是栈?什么情况下会在堆(栈)上分配数据?它们有性能上的区别吗?“结构”对象可能分配在堆上吗?什么情况下会发生,有什么需要注意的吗?
 
.NET进程被创建时就会有一个堆随之被创建, 用来保存该进程在运行中需要使用的对象/数据; 当一个线程被创建时, 会有一个栈被创建,用来保存方法调用参数, 局部变量等轻量型数据.
当一个类里面包含一个结构体类型的变量时, 该结构体类型会被分配在堆上.  (不知道有什么需要注意的…)
 
> 泛型的作用是什么?它有什么优势?它对性能有影响吗?它在执行时的行为是什么?.NET BCL中有哪些泛型类型?举例说明平时编程中您定义的泛型类型.
 
泛型有利于算法重用.
.NET进程地址空间中, 对象和类型是分开存放的, 当我们实例化一个泛型的时候 (比如List<int> list = new List<int>();), 会有一个新的类型对象被创建(该对象并不位于GC堆上), 当我们在使用这个实例化泛型去创建新的对象时, 才会有一个对象(GC堆上)被创建. 所以性能上会有些许的损失. 当我们使用一个值类型作为参数,去调用一个接收引用类型参数的方法是, 会有装箱发生, 这时我们可以考虑实现一个泛型, 并在运行时确定方法的参数类型.
 
> 异常的作用是什么?.NET BCL中有哪些常见的异常?在代码中您是如何捕获/处理异常的?在“catch (ex)”中,“throw”和“throw ex”有什么区别?您会如何设计异常的结构,什么情况下您会抛出异常?
 
呃, 异常可以通知我们程序出错, 比如ArgumentException, NullReferenceException…
异常的发生会导致一次stack walk, 去寻找对应的exception handler, 在这个过程中, stack trace的信息会被一层层的收集, throw ex会清空之前收集的stack trace的信息, 相当于抛出了一个新的异常, 而throw不会, 所以throw ex不利于找出问题所在.
不同的layer应该catch不同exception, 最上层处理最general的exception, 底层去处理一些detail的exception.
 
> List<T>和T[]的区别是什么,平时你如何进行选择?Dictionary<TKey, TValue>是做什么的?.NET BCL中还有哪些常用的容器?它们分别是如何实现的(哪种数据结构)?分别是适用于哪些场景?
 
T[] 继承自Array, 而List<T>仅仅是对T[]的封装; 相比于T[], List<T>的size是动态变化的.
Dictionary<TKey, TValue>可以用来存储键/值对.其他的比如HashTable, SortedList等.
 
> 抽象类和接口有什么区别?使用时有什么需要注意的吗?如何选择是定义一个“完全抽象”的抽象类,还是接口?什么是接口的“显式实现”?为什么说它很重要?
 
抽象类定义了一个类及其子类是什么, 而接口更多的表现出一个类可以做什么.
当一个类实现连个不同的接口, 而这两个接口中包含一些相同签名的方法时需要用到显示实现.
 
> 字符串是引用类型类型还是结构类型?它和普通的引用类型相比有什么特别的地方吗?使用字符串时有什么需要注意的地方?为什么说StringBuilder比较高效?在连接多个字符串时,它无论何时都比直接相加更高效吗?
 
String是引用类型, 其特殊之处在于一个string是不可变的, 当我们对两个string使用连接操作时, 会生成一个新的string 对象, 而原来的两个string保持不变.
在和native代码做interop时, 对于传出参数 (char* outStr), 应当选择使用stringbuilder而非string.
StringBuilder内部维护着一个char[] 数组, 在做连接字符的操作时会动态增加其大小, 但是, 当原有的数组不够用时, StringBuilder会重新创建一个新的char[]数组, 值得注意的是原来的数组不会被抛弃, 新创建的数组只会用作存储新添加的字符.
如果说StringBuilder有”不高效”的话,应该就是在原有数组空间用尽的情况下吧.
 
> 如何高效地进行数组复制?“二维数组”和“数组的数组”有什么区别?在使用双重循环遍历一个二维数组时,如何选择内外层的遍历顺序?
 
不清楚, 因为数组的元素在内存中的分布是连续的, 我能想到的方法是直接使用内存拷贝API.
二维数组是二维的, 数组的数组是一维的.
根据内存局部性原理, CPU在读取二维数组的第一个元素是, 第一行的数据也会被一起读入cache, 所以应当先遍历行,随后遍历列.
 
> 什么是元编程,.NET有哪些元编程的手段和场景?什么是反射?能否举一些反射的常用场景?有人说反射性能较差,您怎么看待这个问题?有什么办法可以提高反射的性能吗
 
对元编程了解十分有限, .NET的CodeDom(或者使用reflection emit动态创建类型)应当是其中的一个场景.
基于元数据, 反射帮助我们在运行时动态获取程序集/类型/方法/属性等等的信息, 可以用于加载Addin.
有得必有失, 反射功能强大, 只要不是滥用, 其带来的益处远大于性能上的损失.
 
> 委托是什么?匿名方法是什么?在C# 3.0中,Lambda表达式是什么?扩展方法是什么?LINQ是什么?您觉得C# 3.0中还有哪些重要的特性,它们带来了什么优势?BCL中哪些类库和这些特性有关?您平时最常用哪些
 
委托可以认为是类型安全的函数指针, 此处省略741个字…


说起来我也面试过相当数量的.NET(包括C#,后文不重复)程序员了,有的通过电话,有的面谈。后来发现,其实提的问题来来回回也就那么几个。这些问题有的已经有十年历史了,至少也有三年。我想对于一个“不错”的.NET程序员来说,在简单的提示下绝大部分问题应该可以“对答如流”。可能您也会觉得这些太细节,真要追究起来似乎也大都不是必须的,无视这些照样可以写程序,做网站,赚工资,但是我不会满足于成为(包括招聘)这样的程序员,暂时也懒得解释掌握这些东西的益处和重要性。 每个人都有自己的看法, 一切就看您自己的选择了。

那么现在就开始吧。

下面是我面试时问的一些基本问题。我认为一个程序员的未来还是基于他对这个行业的兴趣及悟性。当然,有好的基础是更好的。如果我要找Asp.Net方面的人,我当然喜欢应聘者对Asp.net有较好的经验。但对其将来的发展,我还是注重下面的几条。仅供讨论。
1、为什么选择程序员或者IT行业:了解其兴趣爱好,以及对IT的看法。
2、对程序员有什么看法,以后想不想做管理:了解是否愿意扎实的做程序员工作,但要注意分清对方是否受到社会言论影响
3、对当前的IT的热点问题有什么看法:了解是否了解最新信息,以及对新信息的自主看法。
4、询问有关数据结构的问题,如链表的概念,排序等,可以再问一些高级概念例如B树,操作系统的死锁问题等:了解是否计算机知识扎实,高级概念一般学校不讲,看是否有对知识钻研及自学的能力。
5、薪金要求
6、居住地点:考虑到是否是外地人,则房租,车费等问题需要考虑
7、有无做过项目,并描述:考察动手能力
8、学习成绩:中等偏上较好
9、有没有自己想过什么创意:了解其发散思维如何


70分人才:基础知识扎实,有一定的灵活性,善于自学习,对新事物有了解并有自主看法,与人交流通畅。

90分人才:拥有较高的技巧,知识广博,喜欢钻研,动手能力强,有毅力。

NET方向高级开发人员面试时应该事先考虑的问题

(澄清一下,我发帖的目的不是用来专门给人评价这些问题的好坏的,实际上我所在的公司就考察这些问题。而能够基本上答出来的可以说百里挑一。如果各位觉得这些问题很简单,那么基本上在.NET面试环节就没有什么问题了,同时欢迎提供一些更多的问题。如果还有些不知道,那么不妨静下心来思考一下(或者用15秒搜索一下),没有必要花太多时间来攻击题目的合理性。毕竟,几乎所有的面试都是这样。如果没法改变,我们还是学着适应吧。)

如果你的简历上面说“精通.NET”,那么下面的问题应该大都可以给出较完美的答案。我会稍后给出一些我的想法,还请各位不吝指正并参与讨论。也欢迎提供给我更多的问题。
这里还有一些基础问题:http://www.cnblogs.com/dflying/archive/2006/04/01/364458.html
注:对于每个判断是非问题,都要考虑“为什么”与“为什么不”。
Thread和Process之间有什么区别?.NET新引入了Application Domain的概念,这样他们三个之间有什么区别?引入了Application Domain会带来一些潜在的问题么?
Windows Service与普通的EXE在执行过程中有什么区别?
一个进程可以访问的Windows地址空间有多大?等于系统的虚拟内存大小么?这两方面将对系统的设计产生什么样的影响?
EXE和DLL之间的区别是什么?在系统设计中应该如何选择使用它们?
普通的EXE与.NET EXE的执行过程有什么不同?
什么是弱类型,什么是强类型?在系统设计中应该首先考虑使用哪种类型?
PDB文件是作什么用的?里面包含了什么信息?
Cyclomatic Complexity是什么?为什么它很重要?
为创建一个critical section以访问某个变量书写一个标准的lock() 并加上double check。
为某个对象实现标准的Dispose模式。
什么是FullTrust? 存在于GAC中的 assembly 拥有FullTrust么?
下面这个命令是做什么的?gacutil /l | find /i “system”
下面这个命令是作什么的? sn -t something.dll
跨防火墙的 DCOM必须打开哪个端口?端口135是用来做什么的?
有什么办法可以与现有unmanaged code集成?在集成的时候应该考虑什么问题?
简要解释一下OOP与SOA都是用来作什么的?
XmlSerializer是如何工作的?进程运行XmlSerializer时候需要什么样的ACL权限?
在系统设计时,何时应该使用try catch?何时需要避免使用?
Debug.Write()和Trace.Write()之间有什么区别?二者分别应该用于何处?
Debug Build和Release Build有什么区别?在执行效率上有什么明显的区别么?
JIT是针对Assembly还是Method发生的?解释一下为什么.NET的设计者要这样做?
简要描述一下GC的执行过程。
应该如何选择使用abstract class还是interface?
在设计一个自定义类型时应如何选择使用Value Type还是Reference Type?
对于Value Type和Reference Type,a.Equals(b)的默认实现方式有什么不同?
.NET中为什么不提供默认的deep copy?如果需要,要如何实现deep copy?
相对于.NET 1.1,.NET2.0为了避免过度的boxing/unboxing造成的系统开销提供了哪些支持?
String是Value Type还是Reference Type?为什么.NET中的String对象被设置成immutable?
如果您能较完美的回答其中大多数问题,你已经可以毫无疑问的宣称自己“精通.NET”了。祝各位好运!

************************************************************

还有架构、设计、性能、扩展性、面向对象、设计模式。。。。

泛型,接口和抽象类也是我面试的主要问题,还有一个就是lambda表达式和表达式树的区别

我们通常问些算法数据结构的题。

引用类型值类的的问题应该还好吧,毕竟网上有大把这类问题的“答案”,除非问的是类似“值类型作为局部变量时有没有可能在堆上分配内存”这种和编译器实现密切相关的人问题。

PS.你要来的话数据结构和算法还是要考的哦^_^

写一个Swap函数,不借助第三方变量
写一个Event
写一个线程安全的Event
自定义Attribute
写一个存储过程

 

************************************************************


.NET Quiz
下面两个函数签名有什么区别,能举例子详细说明下吗   private void Modify(string str){...}          private void Modify(ref string str){...}
ref 和out 参数有什么区别,为什么要这样设计
Int? 是什么, 什么是nullable类型, 值类型 or 引用类型? 怎么理解 int? I = null;为什么要引入Nullable类型
GetType() 方法有什么用, 哪里定义的, 子类可重写吗? Int? i = 2; i.GetType() 返回的是什么类型,为什么,意义在哪里,怎么做到的?  Int? i = null; i.GetType() 为什么会异常,真的是i没有分配空间,没有初始化引起的吗?
泛型和delegate 有什么共通性, 共同的理念是什么
什么是代码可读性, 怎么看待 可读性 VS 性能 问题
怎么理解封装, 就是为了屏蔽数据? 能不能从更高的层面理解这个问题
Array 和 List 有什么区别; List 和 LinkedList 有什么区别; 性能,应用场合?什么是deque(double ended queue)? 不知道的话没关系,面试官给出定义,特性,要求被面试者用现有的集合类实现一个deque吧
try { } finally {} finally 里的代码一定能保证执行吗 ? 如果不能,什么情况下。 throw; throw ex; 有什么区别, 什么时候需要重新抛出自定义的异常
Assert 是什么,平时用的多吗,什么是防御式编程? 方法检测时,传入的参数为空情况下,是用Assert 呢还是直接抛异常?
什么是函数式编程,什么是面向对象编程,面向对象编程一定比函数式编程有意义吗? 什么是面向组件开发, 什么是AOP,什么是面向服务编程, 他们有共性吗,他们的引入是为了解决什么样的问题? 为什么历史是朝这个方向发展的, 可以倒着来吗?
在主线程中进行计算密集型操作,这个时候UI能响应用户反应吗,如果要更新UI 怎么办? 如果要用一个进度条实时反馈当前计算进度,应该怎么做? 可以在其他线程进行如下操作吗? textBox.Text = "Name"; 为什么? 为什么有这个限制?  textBox.BeginInvoke( action) 做了什么事. 
有人说:软件开发中所有的问题,都可以引用中间层解决。 你怎么理解?举些例子吧。 
IL 是什么,引入的理念是什么? 什么时候IL才会被编译成native代码 。 下面两段代码有什么区别 
       //  代码 1:
static void Main(string[] args)
{
   Console.WriteLine("Start In main");
   A a = new A();
   Console.WriteLine("End In main");
}
 
//  代码 2:
static void Main(string[] args)
{
    Console.WriteLine("Start In main");
    SimpleWrap();
    Console.WriteLine("End In main");
}

void SimpleWrap()
{
   A a = new A();
}
      如果class A是定义在另一个工程里,运行的时候凑巧A所在的dll不在应用程序目录下,会发生什么,两者输出有不同吗?
ICloneable是什么,什么是浅克隆,什么深克隆,如何实现深克隆,原理是什么,你怎么理解。 如果下面函数是一事件响应函数链上一环,应该注意什么:  (提示: const  应该明白我想问什么了吧)
private void OnPreSelected(ObjectPath path)
{
    // Setp 1: check valid path
    path.PopTo(...)
    if (path == ...)
    ...
}

附加题:一个计算密集型操作,我不想使用多线程,又希望同步进度条, 可以做到吗? 如何做到?(提示: 消息泵, .NET 3.5)(如果有人能顺畅答上这道题,我觉得可以加50分:))


============================================================
.net是指微软推出的.net框架,它提供了基于.net平台的运行时环境和公共基础类库。 CLI是ECMA组织制定的公共语言基础设施标准,它是由微软公司建议和主要参与制定的。 CLR是公共语言运行时,是.net框架中对CLI的运行时标准实现。 IL是CLR的中间语言,任何运行于CLR平台的高级语言都可以编译成IL汇编语言,CLR二进制码也可以一一对应地逆向翻译成IL汇编语言。 JIT是指即时编译,即以CLR二进制码发行的应用程序,在代码第一次被执行时翻译成目标机器环境的指令。 GC是垃圾回收,垃圾回收算法关注已分配的内存块和和内存块之间的引用关系,最简单的回收策略是"引用计数",还有"标记和清除"等回收算法,现代回收算法基本都是分代回收。

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

类的内存分配在堆中,类型为"类"的变量仅仅保存一个引用,而结构内存分配在变量原地,它的生存周期跟变量的生存周期是一样的。一般而言,因为访问结构时少了一个解引用操作而会略快,但因结构类型可能导致大块内存分配,所以使用不当反而会导致性能下降。BCL......不熟啊。自定义类型时,通常对效率要求比较苛刻,或者对内存布局有要求(例如跟C++或者unsafe代码交互)的时候会选择结构类型,而需要频繁传递,各处引用时则选择类。

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

堆就是一大块自由内存,把它分成若干内存块,系统维护各个内存块的已分配和未分配状态。栈就是一小块内存,以push和pop的方式分配和回收。一般而言,函数局部变量和参数都是在栈上的,而new的对象在堆上分配。结构对象在做为类成员的时候就是分配在堆上。没什么需要注意的......


.net是微软推出的框架.CLI是公共语言接口?,CLR公共语言运行环境,IL运行在.net之上的类似汇编的语言,JIT即时编译用于首次加载时编译为可重复运行的模块,GC垃圾收集,主要是根据索引数判断是否收回,有定时机制.

类有类的生存周期而结构没有,需要更多维护.BCL里有Math?性能考虑,结构需要,struct足够.没有逻辑或者只是提供单纯结构的选择struct.

笼统答之需要new的都在堆上,其余在栈中.函数中声明的对象会在当前栈上分配.有区别,栈能够自动收回.结构对象可以分配在堆上,结构对象过大时就会发生.

泛型用于类型安全的操作.优势是类型安全.没有.不清楚.集合,事件,代理.数据库操作时一般使用泛型.

中断流程,冒泡传递.编译异常,运行时异常,IO异常等.TryCatch捕获.throw不处理,而throw则抛出指定异常.依据逻辑不同声明不同一样.在底层业务无关时抛出,交由上层处理.

一个是泛型列表对象,一个是T类型数组,一般选择泛型列表对象,自有灵活,安全.字典泛型,传入指定TKey类型作为key,TValue作为内容.很多容器.List是双链列表,Dict是Hash.列表是变长的固定类型的集合,Dict是有一个对应关系.

继承和组合的区别.抽象允许有实现,接口没有实现逻辑.....

字符串是引用.有个字符串缓存池.他是不可变对象.SB是可变对象.不是,在链接数量少于一定量级时,还不如他的构造所带来的消耗.

Array.copy.一个是存内容,一个是存引用.先遍历外层.

对程序本身的编程,反射,ASP.net MVC使用.程序解析程序自己.数据库链接获取,IoC.适当的缓存+灵巧的架构,不会产生谈反射变的样子.缓存解决反射性能的好办法.

委托是函数的指针.不给名称的方法就是匿名方法.在C#3.0中Lambda就是简化了的匿名方法.语言集成本地查询.var,拓展方法,他们带来了脚本化的灵活.表达式类.Linq最常用.

博客猿,stackflow,javaeye,EF,Asp.netMVC,Mono.除开.net之外常用python.有一个C#与Python语言本身涵盖的设计模式比较.

感觉老赵还可以添加一些抽象类,接口,泛型叠合的考题.这个在实际工作中很常用,而且问题也多.


这些题目比较细节哦,有些还真不知道,我做了很多年项目,觉得出这些题目让别人好发挥些,能考察出哪些人经验丰富:
1. 一个算法题(递归,字符串处理或急转弯)
2. 如果让你设计一个登陆系统(安全,验证,sso,用户表的设计)
3. 你所熟悉的一个设计模式以及在.net源码里哪里用到了(foreach-iterator, DBFactory...., Provider-strategy)
4. 列举下你熟悉的几种事务使用(DB,SqlTransaction,TransactionScope,DTC,事务提升,wcf分布式事务)
5. 你熟悉的多线程的实现方式(异步委托,thread,threadpool,backgroundworker,4.0里的task,AsyncEnumerator)
6. .net的编译过程(clr,pe,il,jit)
7. 你熟悉的DB优化技巧(读写分离,负载均衡,横向竖向切分)
8. 聊聊你最近使用的一个新技术,用的怎么个爽法
9. 如果给你几个人带,你怎么管理他们的工作(document,coding rule,tfs, scrum,bug track,Daily Build...)
10. 用英语随便写下来你对WebOS的看法.

 

转载于:https://www.cnblogs.com/xiami303/articles/2159161.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
.NET面试题及答案详解主要涉及以下几个方面:基础知识、框架、语言特性、数据库操作、多线程等。 首先,针对基础知识的问题,可能会问到.NET是什么、.NET框架的组成部分、CLR是什么、以及C#和VB.NET的区别等。面试者可以回答.NET是一个面向对象的软件开发框架,包括CLR、FCL、ASP.NET等组成部分,CLR是公共语言运行库,C#和VB.NET都是.NET平台上的开发语言,其中C#更加常用。 其次,针对框架的问题,面试官可能会询问ASP.NET MVC和ASP.NET Web Forms的区别、Entity Framework的作用和优势、以及WCF和Web API的应用场景等。面试者应该了解ASP.NET MVC是一种基于模型-视图-控制器的开发模式,而Web Forms是一种传统的页面式开发模式;Entity Framework是.NET下的对象关系映射框架,简化了数据库操作;WCF用于构建分布式应用程序,而Web API主要用于构建RESTful服务。 此外,还可能会涉及到语言特性,例如面向对象的特性、委托和事件的使用、LINQ的特点等。面试者应该对这些概念有清晰的理解,并能够举出实际应用的例子。 另外,针对数据库操作和多线程方面的问题,面试官可能会考察ADO.NET的使用、并发编程、以及异步编程等。面试者需要熟悉ADO.NET的各种操作方式,以及多线程和异步编程的相关知识。 总之,针对.NET面试题及答案的详解需要面试者全面了解.NET相关的知识点,并能够结合实际应用进行深入阐述,展现出自己的专业能力和经验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值