Hello World
Spiga

我在面试.NET/C#程序员时会提出的问题

2011-03-03 15:38 by 老赵, 39535 visits

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

那么现在就开始吧。

  • 什么是.NET?什么是CLI?什么是CLR?IL是什么?JIT是什么,它是如何工作的?GC是什么,简述一下GC的工作方式?
  • 类(class)和结构(struct)的区别是什么?它们对性能有影响吗?.NET BCL里有哪些是类(结构),为什么它们不是结构(类)?在自定义类型时,您如何选择是类还是结构?
  • 在.NET程序运行过程中,什么是堆,什么是栈?什么情况下会在堆(栈)上分配数据?它们有性能上的区别吗?“结构”对象可能分配在堆上吗?什么情况下会发生,有什么需要注意的吗?
  • 泛型的作用是什么?它有什么优势?它对性能有影响吗?它在执行时的行为是什么?.NET BCL中有哪些泛型类型?举例说明平时编程中您定义的泛型类型。
  • 异常的作用是什么?.NET BCL中有哪些常见的异常?在代码中您是如何捕获/处理异常的?在“catch (ex)”中,“throw”和“throw ex”有什么区别?您会如何设计异常的结构,什么情况下您会抛出异常?
  • List<T>和T[]的区别是什么,平时你如何进行选择?Dictionary<TKey, TValue>是做什么的?.NET BCL中还有哪些常用的容器?它们分别是如何实现的(哪种数据结构)?分别是适用于哪些场景?
  • 抽象类和接口有什么区别?使用时有什么需要注意的吗?如何选择是定义一个“完全抽象”的抽象类,还是接口?什么是接口的“显式实现”?为什么说它很重要?
  • 字符串是引用类型类型还是结构类型?它和普通的引用类型相比有什么特别的地方吗?使用字符串时有什么需要注意的地方?为什么说StringBuilder比较高效?在连接多个字符串时,它无论何时都比直接相加更高效吗?
  • 如何高效地进行数组复制?“二维数组”和“数组的数组”有什么区别?在使用双重循环遍历一个二维数组时,如何选择内外层的遍历顺序?
  • 什么是元编程,.NET有哪些元编程的手段和场景?什么是反射?能否举一些反射的常用场景?有人说反射性能较差,您怎么看待这个问题?有什么办法可以提高反射的性能吗?
  • 委托是什么?匿名方法是什么?在C# 3.0中,Lambda表达式是什么?扩展方法是什么?LINQ是什么?您觉得C# 3.0中还有哪些重要的特性,它们带来了什么优势?BCL中哪些类库和这些特性有关?您平时最常用哪些?
  • 工作之外您看哪些技术相关的书、网站、社区、项目等等?您还接触哪些.NET以外的技术,能和.NET或.NET中有针对性的部分做个对比吗?

以上便是暂时想到的问题,以后有需要再做补充──当然,不提供答案,一是写出来太累了,二是这些东西往往也没有完全标准的答案。您一定发现了,这些问题其实都是和.NET基础相关,与某个特定的框架或是类库并没有多大关系。在实际面试时,如果是Web开发人员,我一定还会考察对方对ASP.NET及Web基础(更主要是协议和理念相关,而不是HTML,JS,CSS编程)的了解,某些情况下还会有关于多线程、并发的知识点。其他可能还会有一些例如软件开发、设计、实现等实践方面的问题。更重要的是,我一定会需要您在白板上当场写代码来解决一个小问题。不难,也不会直接要求写某个经典算法,事实上甚至是“交换元素”这种简单到近乎毫无意义的问题,只可惜这类题目也能筛掉八成以上的人。

我并不担心大家知道这些问题,而且我可以表示以后的面试估计也逃不开这些。如果您有某些意向,做些针对性的准备可能也是不错的。当然,既然是面试,就会有“随机应变”,你我都一样。我有自信可以在不断追问下发现到底是“真材实料”还是“临时抱佛脚”。

您觉得还有哪些问题值得补充呢?

Creative Commons License

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名赵劼(包含链接),具体操作方式可参考此处。如您有任何疑问或者授权方面的协商,请给我留言

Add your comment

142 条回复

  1. Ray
    210.83.228.*
    链接

    Ray 2011-03-03 15:48:11

    我很想知道老赵的工作内容,呵呵~给大家透露一下吧,创新院都做什么啊?

  2. 躺着读书
    116.77.210.*
    链接

    躺着读书 2011-03-03 16:02:40

    赶快抄下来,背下来。

  3. winter
    114.80.133.*
    链接

    winter 2011-03-03 16:11:24

    扩展方法是什么? 除了这个问题 好像都能蒙上来 哈哈哈

  4. 链接

    twty1988 2011-03-03 16:17:06

    哈哈,有点意思。

  5. 老赵
    admin
    链接

    老赵 2011-03-03 16:27:13

    @winter

    就是LINQ会涉及到的几个小特性之一咯。

  6. Belleve Invis
    218.22.21.*
    链接

    Belleve Invis 2011-03-03 16:27:52

    坐等喷神出现,小板凳围观

  7. DeepNight
    192.165.214.*
    链接

    DeepNight 2011-03-03 16:46:30

    其实仔细看了CLR via C#大多数的问题还是能答上来的。不过这年头就是一堆.NET程序员不看这本书。

  8. 老赵
    admin
    链接

    老赵 2011-03-03 16:54:58

    @DeepNight: 其实仔细看了CLR via C#大多数的问题还是能答上来的。

    一点没错。

  9. 链接

    Jim Liu 2011-03-03 17:22:08

    呃呃,我几乎都答得上来(more or less),当初比较重基础,看来这个选择还是有前途的。

  10. 老赵
    admin
    链接

    老赵 2011-03-03 17:27:51

    @Jim Liu

    本来就是基础题……不过严格说来,我们还没对过答案,哈哈。

  11. 链接

    Jim Liu 2011-03-03 18:00:53

    嗷嗷,大多数题目我还是基本相信答案会(比较)符合你的期待的。

    对于我不相信的那些,也都是我本身了解比较少的啦。

  12. 冷冷
    123.150.183.*
    链接

    冷冷 2011-03-03 18:10:54

    虽然这些我都能流畅回答,但是临近毕业脑呆一热,居然去了一个还在用.net 1.1做项目的天津最大的对日的外包企业。没有泛型和匿名对象等等东西做东西太难受了,打算辞职却悲剧的发现三方协议签了5k的违约金,唉,构思老夫伤心往事了……

  13. hhshuai
    220.231.59.*
    链接

    hhshuai 2011-03-03 18:24:44

    惭愧,第一题就把我难住了!

  14. 装配脑袋
    207.46.92.*
    链接

    装配脑袋 2011-03-03 18:25:49

    路过~ 无鸭梨

  15. Shaun Xu
    218.240.156.*
    链接

    Shaun Xu 2011-03-03 18:25:51

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

  16. 装配脑袋
    207.46.92.*
    链接

    装配脑袋 2011-03-03 18:29:46

    除了第二题我会问以外,其他题我面试的时候都不会问。

  17. _龙猫
    124.160.91.*
    链接

    _龙猫 2011-03-03 18:30:49

    很恶心啊,哈哈~感觉越涉及到底层的,自己就越不了解了.

  18. Dreampuf
    221.221.9.*
    链接

    Dreampuf 2011-03-03 19:01:52

    拟答一份

    .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语言本身涵盖的设计模式比较.

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

  19. Alexis
    116.227.181.*
    链接

    Alexis 2011-03-03 21:47:37

    谢谢老赵,正好明天要面试,准备下

  20. 老赵
    admin
    链接

    老赵 2011-03-03 22:07:48

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

    这是指哪些?

  21. 老赵
    admin
    链接

    老赵 2011-03-03 22:08:22

    @装配脑袋

    脑袋会问哪些?其实像List,Dictionary还是很实际的,而且许多人不知道……

  22. 横刀天笑
    122.12.1.*
    链接

    横刀天笑 2011-03-03 22:21:43

    @Dreampu

    你这拟的答案大部分都是错误的吧。

  23. 老赵
    admin
    链接

    老赵 2011-03-03 23:12:15

    @横刀天笑

    好像全都有问题或不能让我满足的,不知道现场一点点“套”能不能套出好的结果来,呵呵。

  24. 装配脑袋
    123.118.159.*
    链接

    装配脑袋 2011-03-03 23:12:59

    @老赵

    其实问一个引用类型值类型就已经打击一片了,你的题都问我就招不到人了,呵呵。我们通常问些算法数据结构的题

  25. 装配脑袋
    123.118.159.*
    链接

    装配脑袋 2011-03-03 23:16:08

    老赵确定遇到过这些题都会的人?他们怎么不来我这面试啊……

  26. 幸存者
    123.120.36.*
    链接

    幸存者 2011-03-03 23:32:01

    @装配脑袋

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

  27. 横刀天笑
    122.12.1.*
    链接

    横刀天笑 2011-03-03 23:41:21

    @装配脑袋 脑袋,我想我应该能全部回答出来~~你收了我吧。。。

    PS:这个评论的时间显示的是不是有问题?

  28. 装配脑袋
    123.118.159.*
    链接

    装配脑袋 2011-03-03 23:49:42

    @横刀天笑

    当我在圈子里的时候,感到大家都是这么的牛,但当我面试的时候才知道现实的残酷。。。 PS.你要来的话数据结构和算法还是要考的哦^_^

  29. 链接

    zagelover 2011-03-04 01:10:48

    只会做,基础太差了,看来要补习才行了~

  30. 老赵
    admin
    链接

    老赵 2011-03-04 09:00:40

    @装配脑袋: 老赵确定遇到过这些题都会的人?他们怎么不来我这面试啊……我们通常问些算法数据结构的题

    绝大部分人都不会绝大部分问题啊,呵呵。数据结构算法我觉得就更不会了……

  31. 链接

    麒麟.NET 2011-03-04 09:23:34

    @Dreampuf

    这答案看了让人汗颜啊。很多回答都太简单了,这里面所有的问题都不是一两句话能解释明白的,而您有的却想用一两个字去解释……这么简洁的答案如果答不到点子上,就等于错误了。比如“笼统答之需要new的都在堆上”,难道struct不能new吗?

    @装配脑袋

    把我也收了吧。

  32. 链接

    麒麟.NET 2011-03-04 09:24:46

    @横刀天笑 @老赵

    所有的时间都有问题,都是格林威治时间……

  33. else
    124.42.24.*
    链接

    else 2011-03-04 09:30:17

    这些问题还是比较厚道的,有的看起来让你感觉遥不可及。加油。。

  34. 老赵
    admin
    链接

    老赵 2011-03-04 09:34:24

    @麒麟.NET: 所有的时间都有问题,都是格林威治时间……

    你得到了它……

  35. 链接

    麒麟.NET 2011-03-04 09:44:03

    @老赵

    为啥不fix?

  36. 程序设计的艺术
    60.216.4.*
    链接

    程序设计的艺术 2011-03-04 10:17:12

    CLR via C#上讲的比较细,像是并发的问题,可以问:异步跟多线程的关系,appdonmain是什么,缓存的理解等。

  37. 链接

    simon 2011-03-04 10:24:22

    请问薪酬如何?能否提供大约范围。

  38. 老赵
    admin
    链接

    老赵 2011-03-04 10:33:20

    @麒麟.NET

    懒……

  39. 老赵
    admin
    链接

    老赵 2011-03-04 10:34:14

    @程序设计的艺术

    我倒觉得现在对并发的要求还不高……不过的确也可可以加,包括异步什么的……

  40. 老赵
    admin
    链接

    老赵 2011-03-04 10:34:56

    @simon

    视个人能力而定咯,不过月薪1w起总归有的。

  41. anytao
    218.240.156.*
    链接

    anytao 2011-03-04 10:38:47

    练习方面,我一般会选其中的一二来考察:

    代码演习

    • 写一个Swap函数,不借助第三方变量
    • 写一个Event
    • 写一个线程安全的Event
    • 自定义Attribute
    • 写一个存储过程
  42. anytao
    218.240.156.*
    链接

    anytao 2011-03-04 10:40:16

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

  43. Zealot
    174.136.108.*
    链接

    Zealot 2011-03-04 10:45:26

    只有需要大量码农的公司才会去问这些低级,枯燥,乏味,无趣,易过时的语言特性.他们需要的就是进来就能迅速写出大量垃圾代码的民工.

  44. 装配脑袋
    207.46.92.*
    链接

    装配脑袋 2011-03-04 10:46:48

    @麒麟.NET

    你们赶紧投简历呀~ 不过先说一个案例哦,以前这些题都可以对答如流的罗炳桥同学还是被我两个残酷的同事给拒了……

  45. 老赵
    admin
    链接

    老赵 2011-03-04 10:48:16

    @Zealot: 只有需要大量码农的公司才会去问这些低级,枯燥,乏味,无趣,易过时的语言特性.他们需要的就是进来就能迅速写出大量垃圾代码的民工.

    你以为能快速写出大量垃圾代码的民工能回答这些问题?

  46. 老赵
    admin
    链接

    老赵 2011-03-04 10:49:13

    @anytao: 写一个Swap函数,不借助第三方变量

    其他还好,但这个感觉没多大意思吧……

  47. 老赵
    admin
    链接

    老赵 2011-03-04 10:50:02

    @装配脑袋

    你们看中的是什么呀?微软很米很霸道的,他们都看不上我,55555。

  48. 链接

    yang 2011-03-04 11:05:23

    google了一下,发现原来我一直对元编程理解错了。自动生成代码的话,我一般的做法是php+mysql,感觉文字处理的话,常规的编程解决方案,没有能在php之上的。之前以为元编程是对IL进行编程呢,类似于实现一些语法不支持的机能一类的。

    BCL这个术语还真没接触过,不过说基础类型的话就能理解了。throw那个应该是stack trace不一样吧,throw不带参数这种用法感觉有点别扭的,看上去像默认参数,其实又不是。再补充的话就是Unit Test和Reflector的问题了,毕竟只会写代码不会调代码的话,就只能当码农用了。

  49. 横刀天笑
    59.108.16.*
    链接

    横刀天笑 2011-03-04 11:21:22

    @装配脑袋: 你们赶紧投简历呀~ 不过先说一个案例哦,以前这些题都可以对答如流的罗炳桥同学还是被我两个残酷的同事给拒了……

    那还是算了~~

  50. 013231
    218.56.228.*
    链接

    013231 2011-03-04 11:22:35

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

    这个问题非常基础吧,装箱了不就在堆上了吗。.Net程序员不至于装箱都不知道吧。

  51. Dreampuf
    221.221.14.*
    链接

    Dreampuf 2011-03-04 12:00:54

    那份拟答,我是一时兴起敲出来的,完全参照个人记忆,没有考证,各位权当娱乐吧.

    @老赵

    泛型的继承.当时的场景是在数据访问时,一个抽象的泛型类负责CRUD等方法,子类根据职责不同重载其方法,在继承泛型类的时候,很多原来想当然的实现,无法正确执行.吃了很多亏,不得不推倒重来.现在想来是想完全依靠语言特性来弥补设计的不足.

  52. 幸存者
    218.206.66.*
    链接

    幸存者 2011-03-04 12:05:13

    @013231

    没有那么简单,装箱之后就不是值类型了。

  53. jiaxingseng
    123.114.39.*
    链接

    jiaxingseng 2011-03-04 13:01:41

    嘿嘿,确实看过CLR via C#的基本无压力啊。不过对于现在我的水平而言那本书的最后线程那几章还是比较难的,而且有些内容平时不太用到就记忆不深刻,比如序列化神马的。果然还是要每隔一段时间再深化一下~ 关于最后一题,老赵又要说Mono是每个优秀.Net程序猿的必修课了吧~哈哈。老赵给推荐一些mono上的项目及其应用场景吧~~只接触过Cecil

  54. Zealot
    114.113.197.*
    链接

    Zealot 2011-03-04 16:43:42

    面试是一个双向选择的过程, 并不仅仅是一个面试管选择程序员这么简单. 如果一个资深工程师精通多种语言, 系统设计与算法, 遇到这些题目第一反应肯定是认为你在招C#的码农. 并不是说一般程序员能否答出这些问题, 而是花大精力学习这些低级语言特性的程序员必然是鼠目寸光; 更加有追求的程序员会去研究某种语言特性为何如此设计, 这样设计比其他语言那样设计有什么优缺点. 面试的时候加入这类问题就更有可能招到更好的程序员, 例如这篇C#设计者之一的写的关于泛型设计的论文。各种语言特性之争已经非常混乱了, 再把某种语言的某种特性提到面试里面, 必然是不可取的, 除非你只想要只熟悉一种语言进来就能快速写代码的人.

  55. 013231
    218.56.228.*
    链接

    013231 2011-03-04 17:05:41

    @幸存者

    那答案应该是什么?

  56. 013231
    218.56.228.*
    链接

    013231 2011-03-04 17:16:43

    @Zealot

    如果连这些"低级语言特性"(或者说是基础)都不知道,恐怕也无法回答"某种语言特性为何如此设计, 这样设计比其他语言那样设计有什么优缺点"这种高级问题吧.以泛型为例,如果知道.Net中的泛型是如何实现的,回答

    泛型的作用是什么?它有什么优势?它对性能有影响吗?它在执行时的行为是什么?.NET BCL中有哪些泛型类型?举例说明平时编程中您定义的泛型类型。

    这题自然不成问题.如果这题都答不出来,自然也写不出那样的论文.为什么说"花大精力学习这些低级语言特性的程序员必然是鼠目寸光"呢?

  57. 链接

    麒麟.NET 2011-03-04 17:30:22

    @装配脑袋: 你们赶紧投简历呀~ 不过先说一个案例哦,以前这些题都可以对答如流的罗炳桥同学还是被我两个残酷的同事给拒了……

    这太夸张了,因为什么被拒?

  58. 链接

    麒麟.NET 2011-03-04 17:35:53

    @Zealot: 更加有追求的程序员会去研究某种语言特性为何如此设计, 这样设计比其他语言那样设计有什么优缺点.

    研究过这些语言特性为何会如此设计的程序员,自然能对这些问题对答如流。知其所以然的,必然知其然。因此问这些问题是招到好程序员的必要(非充分)条件,所以才会去问。兄弟你把自己绕进去了。

  59. 老赵
    admin
    链接

    老赵 2011-03-04 17:42:24

    @Zealot: 花大精力学习这些低级语言特性的程序员必然是鼠目寸光; 更加有追求的程序员会去研究某种语言特性为何如此设计, 这样设计比其他语言那样设计有什么优缺点. 面试的时候加入这类问题就更有可能招到更好的程序员, 再把某种语言的某种特性提到面试里面, 必然是不可取的, 除非你只想要只熟悉一种语言进来就能快速写代码的人.

    其实吧,很显然这些都是开放题,你又不知道我满意的答案是什么,也不知道对方会怎么答,那么你为什么说我是希望拿到“低级语言特性”、“鼠目寸光”的答案?你觉得确定的、正确的答案,我可能还会不满,会追问呢。

    搞了半天,你一边反对我的面试题,一边和我的目的颇有相似,直接看的我凌乱了……有一点你说的不错,我是希望对方是一个“能够马上写代码的人”,但我可不要“只能”马上写代码的人。我这些问题也是经过几十上百人考验的,筛掉无数人,肯定不是随随便便能让我满意的,放心吧。

  60. 链接

    anders06 2011-03-04 17:48:38

    我也来凑热闹,篇幅有点长,就写在自己的Blog上了, 里面有一份题目哦,欢迎各位前来点评 我也谈面试 附赠一份题目

  61. 链接

    Ivony 2011-03-04 18:01:36

    我也都会,求包养。。。。

  62. 链接

    Ivony 2011-03-04 18:11:26

    其实Zealot的意思是应该问C#、Java和C++的“泛型”实现有何区别,为什么吧?

  63. 老赵
    admin
    链接

    老赵 2011-03-04 18:18:58

    @Ivony

    如果对方说他也了解Java,那么我自然也会问的,hoho。

    还有,话说你不是为爱走天涯了么,否则这里欢迎你啊。

  64. 横刀天笑
    59.108.16.*
    链接

    横刀天笑 2011-03-04 18:35:42

    @Ivony: 还有,话说你不是为爱走天涯了么,否则这里欢迎你啊。

    为爱走天涯啊,当年我也为爱从上海跑到北京~~不然也去老赵那儿求求签啊

  65. Zealot
    114.113.197.*
    链接

    Zealot 2011-03-04 18:37:32

    我的意思是面试应该脱离语言. 语言毕竟只是一种工具, 把对某种特定语言的理解用来衡量某人的能力, 是完全不公平的! 正如这贴导致一堆人乐此不疲得去寻找这些问题的答案, 殊不知这些问题字面上的答案完全是毫无意义的, 换一个角度来说, 这贴是在误导读者, 把读者局限到对某种语言的某种特性的理解上了.

  66. 链接

    diggingdeeply 2011-03-04 18:38:10

    没用过的东西确实就是不知道,谁能还能精通的面面俱到?有限的时间内问出候选人的强项和弱项,是重点。 比如“delegate和event的关系”我就被问过无数遍,可是我就没怎么看过,每次都含糊,呵呵,因为event我平时很少用。

  67. winter
    114.80.133.*
    链接

    winter 2011-03-04 18:43:39

    回答第一题:

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

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

  68. 小悦
    61.51.90.*
    链接

    小悦 2011-03-04 23:55:50

    我还是觉得给个case,让写段代码比较靠谱..那些逻辑分析能力不清晰的人千万别招到公司来..

  69. snowdreamist
    219.234.81.*
    链接

    snowdreamist 2011-03-05 00:11:34

    Zealot,你的言论有些问题呀,呵呵呵,连一门语言都学不好的人怎么可能会在你说的其他方面有所成就呢,无论数据结构还是算法或者你说的语言设计哲学,这些的基础都是要精通一门语言。 老赵的这些问题足矣问倒我认识的绝大多数人了,不过不得不说,这些知识确实是保证写出 不可笑 代码的基础…… 其实老赵你还差好多内容,并行,同步,异步IO,如何安全结束线程,网络相关知识,序列化,强类型,依赖注入,内部实现,unsafe,COM互操作,dynamic,运算符重载,Equal,ReferenceEqual,CTS等等等,好多呢。

  70. 老赵
    admin
    链接

    老赵 2011-03-05 09:36:45

    @Zealot

    我觉得吧,你有点绕过头了。

    我不认为考察某个东西的时候能够脱离某种具体的技术,在这里具体的技术就是.NET和C#等等。而且我这里的确就是.NET和C#程序员的程序员,从这个角度切入并没什么问题。我也没说不知道这些则“一定不是个优秀程序员”,只能说他一定不是个优秀的“.NET程序员”。

    如果你非要说这些面试题会给人误导我也没有办法,但我相信如果要回答好这些题目,要对这些内容有很好理解,也不可能只局限于.NET和C#本身,一定会了解些虚拟机啊,编程范式啊等等。举例说明,.NET里的GC策略是通用的而不是.NET特有的;谈堆啊栈啊遍历二维数组时内外循环先后顺序的时候,其实就是在考察对计算机体系结构的认识;谈.NET BCL里的各容器类的时候,也不可能避开数据结构。

    所以我还是那个观点:通过这些面试题,绝对招不进来普通熟练工的。

  71. 老赵
    admin
    链接

    老赵 2011-03-05 09:37:28

    @winter

    嗯嗯,不过谈到IL的时候,我也倾向于和CLI相关,而不是CLR相关……

  72. 戏水
    119.40.8.*
    链接

    戏水 2011-03-05 09:49:24

    我出个题可以吗? 找出一个能被1234整除的10位正整数n, 要求n的每一位上的数字都不重复。 请出示代码 或者描述思路

  73. 老赵
    admin
    链接

    老赵 2011-03-05 11:32:24

    @戏水

    我的第一反应就是枚举了,10!也就是个瞬间出解的规模,呵呵。

  74. zzfff
    123.249.127.*
    链接

    zzfff 2011-03-05 11:35:12

    不能回复?不能回复?

  75. 幸存者
    123.120.34.*
    链接

    幸存者 2011-03-05 14:18:53

    @013231: 那答案应该是什么?

    呵呵,想想C#是怎么实现闭包的。

  76. zzfff
    123.249.127.*
    链接

    zzfff 2011-03-05 15:06:01

    @Zealot

    除了倒数第二问,老赵哪里问语言了?分明是CLR/BCL嘛。CLR via C#,主题是CLR。

    下面问的是语言:为什么C#有implicit conversion而F#没有?为什么F#有automatic generalization而C#没有?说下C# generic method type inference的过程

  77. zzfff
    123.249.127.*
    链接

    zzfff 2011-03-05 15:14:48

    strange things happened,please reload the page...

  78. winter
    114.80.133.*
    链接

    winter 2011-03-05 15:20:12

    @老赵

    我有点记不清CLI里面有没有提到IL的事情了,不过即使没提到,IL确实也是可以支持任何实现CLI的平台的。

  79. yixin
    59.38.32.*
    链接

    yixin 2011-03-05 15:22:47

    刚学习C#起步,以后会多多来学习!

  80. starlightliu
    116.225.97.*
    链接

    starlightliu 2011-03-05 16:44:20

    如何高效地进行数组复制?在连接多个字符串时,它无论何时都比直接相加更高效吗?

    不太清楚,印象中看到过,然后翻了翻老赵以前的文章……嗯嗯

  81. 老赵
    admin
    链接

    老赵 2011-03-05 17:39:46

    @zzfff

    你回复时经常出问题?什么操作系统和浏览器啊?

  82. winter
    114.80.133.*
    链接

    winter 2011-03-05 18:20:58

    继续努力答题中......

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

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

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

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

  83. 老赵
    admin
    链接

    老赵 2011-03-05 18:32:05

    @winter

    他爹威武。

  84. david
    58.38.70.*
    链接

    david 2011-03-05 23:08:26

    为什么回复不了呢...

  85. david
    58.38.70.*
    链接

    david 2011-03-06 00:22:01

  86. 链接

    装配脑袋 2011-03-06 18:12:11

    测试下头像~

  87. just
    221.224.88.*
    链接

    just 2011-03-07 08:17:03

    我想问老赵的是,作为一个程序员,或者说得更白一点,作为在天朝的一个码农,平时工作几乎都不会涉及到这些算是很基础的知识,怎样做才会让自己真正去理解和掌握这些知识呢? 我先说说我能想到的哈:自己研究,工作之余自己做项目,参加一些开源项目。

    除此之外,还有什么?盼答。:D

  88. 老赵
    admin
    链接

    老赵 2011-03-07 10:14:04

    @just

    只是“完成”任务自然用不到,但如果目的是要“做好”任务怎么还用不到?

  89. zzfff
    123.71.105.*
    链接

    zzfff 2011-03-07 11:37:27

    @老赵

    Win7 + IE8。不用markdown就ok?

  90. zzfff
    123.71.105.*
    链接

    zzfff 2011-03-07 11:38:38

    i dont think markdown的作者/测试者很细致

  91. winter
    114.80.133.*
    链接

    winter 2011-03-07 12:43:09

    @老赵

    她姐夫 你别用这么令人误会的称呼啊......

  92. zzfff
    123.71.105.*
    链接

    zzfff 2011-03-07 12:58:42

    义务当测试员。若我这样回复:“@某人 回车 回车 blah blah blah”,提交后就会弹出个对话框,曰:strange things happened

  93. winter
    114.80.133.*
    链接

    winter 2011-03-07 16:09:03

    @某人

    zzfff,试验一下

  94. 链接

    Leo yang 2011-03-07 17:51:56

    原来blog更新到这里了,顶

  95. axgle
    117.136.0.*
    链接

    axgle 2011-03-07 19:41:30

    虽然没学过c#,不过好几个问题都能搭上来呢,哈哈

  96. IUSR
    207.204.229.*
    链接

    IUSR 2011-03-08 08:08:38

    还好,作为一个Java程序员,也能答上来一半儿以上 :D

  97. 链接

    葛亮 2011-03-08 09:17:23

    你必须知道的NET 这书看完基本上就能回答上面的大部分问题了

  98. wgz
    60.191.94.*
    链接

    wgz 2011-03-08 11:29:14

    大部分能答上一些,能不能让面试官满意就难说了,弱弱的顶一下@Zealot,弱弱的说上几句:日常工作中更多的是业务逻辑处理,能选择最合适实现方式,提出设计方案才是最重要的,感觉这些东西了解下就好了吧,没必要深究;能不能答得很好也看自己平时比较关注哪方面,兴趣在哪里。

  99. 老赵
    admin
    链接

    老赵 2011-03-08 12:26:56

    @wgz

    你不该顶@Zealot的,他的要求比我高多了,完全和你的说法不同。你觉得我这个面试题有点“脱离现实”,那他的题目可能根本就接受不了了,嘿嘿。

  100. 老赵
    admin
    链接

    老赵 2011-03-08 12:27:40

    @axgle: 虽然没学过c#,不过好几个问题都能搭上来呢,哈哈

    是啊,所以说我这个面试题其实并非只考察.NET和C#的。

  101. 远走高飞
    183.38.191.*
    链接

    远走高飞 2011-03-08 17:26:14

    这算不算剧透了呢, 赶紧多记下几条

  102. abc
    114.252.191.*
    链接

    abc 2011-03-10 01:42:38

    我是一个大四的学生 发现您说的那些东西我基本上都会打不上来 话说 我应该读那些书 养成什么样的习惯 才能够 回答出以上的问题呢?

  103. abc
    114.252.191.*
    链接

    abc 2011-03-10 01:47:26

    只能打出个别的几道 还不知道对不对,我也学过asp。。。唔郁闷了 啊啊啊啊啊

  104. tshao
    210.13.83.*
    链接

    tshao 2011-03-10 12:23:45

    补一个Scott Hanselman的列表,关注点不仅在.NET和web本身了: http://www.hanselman.com/blog/NewInterviewQuestionsForSeniorSoftwareEngineers.aspx

  105. XueM
    118.121.218.*
    链接

    XueM 2011-03-12 00:44:49

    嗯嗯,认认真真看了一遍,觉得其中很多问题,在平常的练习中都不是很在意,对于.NET也只是了解一些特性和类库的使用方法,像是上面提到的泛型和数组,大部分时间上我都不会去想到底去用哪一个,总是觉得哪个顺手就用哪个。

    读完文章,就有一种冲动去买一本 《CLR via C#》 好好充充电。

  106. waynebaby
    112.64.21.*
    链接

    waynebaby 2011-03-12 14:49:29

    测试下ie9

  107. waynebaby
    112.64.21.*
    链接

    waynebaby 2011-03-12 14:50:00

    终于能说话了

  108. waynebaby
    112.64.21.*
    链接

    waynebaby 2011-03-12 14:54:44

    前一阵我接受的微软内部FTE面试也就占你考题的30%左右

    我表示压力很大啊

  109. JeeChang
    61.190.37.*
    链接

    JeeChang 2011-03-23 14:33:33

    哎呀呀,上个月投了创新院N个职位,结果一个面试电话都没有。向往了N久的地方,不知道神马时候能有那么一个机会,哪怕去碰壁也好!

  110. core
    114.221.118.*
    链接

    core 2011-04-03 09:13:25

    其实这些题都不难,按开发人员的角度来看只有了解这些才能写出合理的代码,struct使用就能看出.net程序员的程度,我觉得搞.net挺背具的

  111. 老赵
    admin
    链接

    老赵 2011-04-03 13:29:55

    @core

    如果你觉得这些是“写出合理代码”的必要条件的话,其实那搞各种技术都一样。比如我觉得用PHP也得了解其内存构造“才能”写出合理的代码。如果某PHP粉觉得可以随便写,不需要,那.NET也不需要──只是我们对“基本要求”的看法不一样而已。

  112. 链接

    宝玉 2011-04-05 02:43:31

    这面试问题和面试官有很大关系,我一般不会问概念性的问题,一般就是问做过的项目,针对项目中涉及的技术问题提问,考察面试者在项目过程中使用的技术程度,并且会基于做过的项目变换需求或提出更高要求,考察面试者是否能应对这样的需求变化,是否有深入考虑过更好的解决方案。

    面试差不离再做上机题考察算法和数据结构这样的基本功和动手能力。

  113. 小小张飞
    219.140.171.*
    链接

    小小张飞 2011-04-13 11:13:59

    没想到在这里见到宝玉了......:)

  114. 小小张飞
    219.140.171.*
    链接

    小小张飞 2011-04-13 11:19:19

    老赵能否将对外的IP再隐藏掉一位呢。

  115. 而扼腕
    59.45.173.*
    链接

    而扼腕 2011-04-13 17:00:18

    这些题都很简单啊,连我这个只工作一年,平常基本从不看.net书的菜鸟都会(除了throw ex那个).除了应届生以外,真有答不上来这些题的人吗?

  116. 老赵
    admin
    链接

    老赵 2011-04-13 22:23:02

    @而扼腕

    应该说八成人是答不出其中八成题目的。

  117. 路人甲说
    112.95.2.*
    链接

    路人甲说 2011-04-13 23:07:46

    看了之后觉得要加油啊

  118. 浪雪
    180.171.167.*
    链接

    浪雪 2011-04-14 20:55:52

    这些都是基础题吧,其实在学习C的时候就想过C的一些不方便的地方,C#只是把这些问题给出了一个自己的答案。比如说C#中的String类和StringBuilder类,其实就是对于不同问题的解决方案。StringBulider类似于对C中字符串数组的一些操作封装起来了,有点像ArrayList的实现。而String类最主要的就是不可变的性质,目的是解决的就是一些CLR的性能和多线程可能产生的问题。 编译器的优化很多,像什么用加号连接字符串也许编译器就帮你解决了,比如java的编译器就可以设置优化等级,像一些只使用了一次的成员变量有时候会被安排在栈上而不是堆上。

    话说这些题里面有不少老赵在自己的博客中都有提及甚至是详解,比如说数组内外顺序那题。深入理解计算机操作系统那本书讲得也很详细了。

    感觉对递归的理解挺重要,那种不断重新定义问题直到一个简单解答的思路很有用。

    另外怀疑真的有八成人八成问题答不出来吗?一眼看上去连我这个毕业几年后才转行的文科大专生都能答出来八成题目。

  119. 老赵
    admin
    链接

    老赵 2011-04-15 01:56:34

    @浪雪: 另外怀疑真的有八成人八成问题答不出来吗?

    绝对的,我面试过的.NET程序员不管怎么样也有三位数个了,呵呵。

  120. zyz
    112.82.187.*
    链接

    zyz 2011-04-22 21:59:16

    clr via c# 3.0中文版翻译如何?准备找来看看。

  121. 小蔡
    124.126.14.*
    链接

    小蔡 2011-04-26 16:47:57

    面试的要求来自于需求,没有万能的程序员,更不能有一概而论的所谓"优秀"和"不优秀"。 重于基础框架开发,着重语言特性。 重于基本功能,着重应用技能。 很多优秀的程序员潜力来自于某种性格特性和敏锐的理解力,甚至人格。

    仅从技术层面很难定义出优秀和不优秀。

    老赵有点太微观细腻了。:)

  122. 老赵
    admin
    链接

    老赵 2011-04-26 20:55:33

    @小蔡

    我考察的是基础技能,在我看来,技术优秀不一定是优秀的程序员,但技术不优秀一定不是。

  123. 链接

    2011-05-08 15:20:44

    看得内牛满面吖.尼玛,这就是一条不归路吖!!! 既然选择了.就要. 努力.再努力.

  124. 链接

    2011-06-02 12:08:14

    @老赵: 只是“完成”任务自然用不到,但如果目的是要“做好”任务怎么还用不到?

    你说的道理我也懂,我所在的小公司,相信大多人都一样,我们想把任务做到八分号,但公司只需要3分好,这时我们该何去何从?

  125. 森林小居
    124.73.85.*
    链接

    森林小居 2011-06-12 08:37:51

    您好,为什么面试总要问这些一惯的东西呢?理论随然重要。但我个人觉得实践经验比上面有些理论问题更重要。比如我可以把理论知道撑握的很透彻。但实际能力很是有限,而且只是照搬与理论知识的的实践,并没有扩展性。这样的人您也会录用吗?我觉得程序与大众的技术一样,最关键在于扩展及创新,并不是把任何事都从理论的角度上来靠,因为太死。

  126. 老赵
    admin
    链接

    老赵 2011-06-13 11:39:26

    @森林小居

    理论和实践都重要。说实话我没见过掌握许多理论但实践很差的人。说理论死,只不过没有掌握好理论而已,理论不是靠死记硬背的,也是需要实践积累出来的。

  127. 链接

    H 2011-06-26 12:38:25

    老赵,你这样面试选中的可是将来能替代你的人,可不一定是公司工作需要的人。 程序员程序员,部分答对,面试出满足工作岗位需要的人就是,要求在进公司前就达到有替代你的潜力是不合适的。

  128. 老赵
    admin
    链接

    老赵 2011-06-27 13:27:53

    @H

    我觉得我就是公司需要的人呀。

  129. 链接

    Ken 2011-07-11 16:24:41

    我一个也答不上来 惭愧

  130. 链接

    James 2011-07-22 21:13:24

    不去面试,但是这些问题貌似没有一个有十足把握的,一直没好好静下心来学基础知识,遗憾呐。

  131. 浪子の无悔
    61.191.26.*
    链接

    浪子の无悔 2011-07-28 17:25:02

    偶然间看到这个帖子,细想自己做开发也有快2年了,大多数的题目都看过也用过其中的技术,但是让我去面试,我相信肯定自己条例不清晰,回答的逻辑性也不好。其实造成这个原因的根本就是不注重理论知识的基础与研究。

    老赵说的很对,一个优秀的程序员肯定是个注重理论的,如果连理论,计算机的工作原理都不清楚的人,怎么可能写出优秀的代码?最近意识到这点,一直在看基础的理论知识,把以前不注重的地方来给强化一下,发现了以前写代码的时候很多的误区。真的!!!

    洗完跟我一样迷茫的园友一起把理论在回顾下吧。

  132. 麦子
    211.103.135.*
    链接

    麦子 2011-08-23 18:49:17

    学习的过程一般是由表及里的,这些问题都是比较"里"的,学的越深,越能轻松回答.

  133. 链接

    xiaobo 2011-09-01 17:17:58

    都是封闭性问题。

  134. 老赵
    admin
    链接

    老赵 2011-09-01 17:37:18

    @xiaobo

    还好,看你怎么回答了。

  135. Unvs
    116.205.179.*
    链接

    Unvs 2011-11-19 12:16:19

    看来还有很多知识需要学习的,如何才能达到高手级人物,恐不断学习、不断成长...

  136. shell
    114.83.56.*
    链接

    shell 2012-01-04 02:17:18

    我毕业了没多久,后来留校工作的,没有去外面面试过,我工作了两个月就辞职了,而且本人没有学历,高中文凭,我常看老赵的文章,对各方面的理解都提升了很多,发现你这篇文章提出的好几个问题,都是你文章里写过的。现在要去面试找工作了,招聘网上发现绝大部分都要大专和本科文凭,没有文凭想找到理想有发展的工作的确困难。 你这篇文章提到的问题,我大部分都能回答出,有一个问题我不知道,就是二维数组。 不知道像我这样没有学历+现在的对编程理解水平的情况,面试结果会怎样呢?

  137. shell
    114.83.56.*
    链接

    shell 2012-01-04 02:17:42

    老赵 你的BLOG 在OPERA下有时候不能回复。

  138. 链接

    Eric 2012-01-10 11:14:57

    我是新手,看到了老赵,觉得好牛。 偶像!!

  139. zhucai
    218.240.45.*
    链接

    zhucai 2012-02-24 19:30:06

    很喜欢被这样的面试题面试。遇到这种题目,面试过程那就是享受啊。(好像遇到过2次)

  140. ClarenceAu
    113.65.204.*
    链接

    ClarenceAu 2012-03-01 12:55:01

    这个有意思,虽然暂时不是进行.net平台的开发,但是通过这些问题,可以在我学习.net平台时提供一些指导性的帮助。

  141. Sweet
    60.216.176.*
    链接

    Sweet 2012-05-24 18:33:49

    试着回答一下:

    1、羞愧无法提供明确的答案

    2、类是引用类型,分配在堆上,struct是值类型,分配在堆上,当然栈上的效率更高,常用的结构如DateTime,用结构是因为时间这个东西基本不存在复用谁的方法,不需要被继承。

    3、栈和堆都是内存,栈很小,堆很大,栈编译器会自动释放,而堆必须由程序员自己释放(非托管),托管的由GC释放。值类型数据直接存放在栈上,引用类型是栈上放一个指针,指向堆内的数据。结构也可分配在堆上,装箱时例如session,cache,至于发生什么情况,没什么体验,不过我想空值应该比较难处理,值类型必须初始化。

    4、泛型应该是体现了算法的重用,保证了类型的安全,比方说IList的Sort()方法,他实现了排序算法,并调用里面元素的Compare 方法,比较大小。性能方面当然是比非泛型要高,因为他不需要装箱,拆箱的操作,还真没有自定义过泛型。

    5、又一次羞愧了...

    6、List应当是一个可变长度的数组,T[]是不可变长度的,选择的话当然是可变的时候用List,不可变时用T[]了。Dictionary是Key,value对形势的这个一种数据结构,用key访问value。那种数据结构这个还真不知道,List不是链表结构,数量达到一定程度宽度就会往上加。

    7、抽象类可以有自己的方法实现,接口只能定义规范,可以继承多个接口,但是只能继承一个抽象类,至于选择要看实物具体的情况,简单来说is a的关系的时候用抽象类,接口的显示实现这个不清楚。

    8、字符串是引用类型,使用了享元模式,字符串需要注意什么地方,不太清楚,StringBuilder实际上是string的一个代理,不需要改变指向享元的情况下就可以修改字符串了。应该不会无论何时都高效,如果有一个string享元已经存在的话。

    9、如何高效复制,不太清楚(用Clone吗?)

    10、再一次羞愧了...

    11、委托就是个函数指针,匿名方法算是没有名字的方法吧,lamda表达式就是个匿名方法,左边参数,右边函数体,扩展方法类似在类外部定义的一个方法, 带来什么好处,编程更加爽...Linq本质上就是基于上述这些东西的。我最常用的就是Linq to 数组,IList

    12、技术方面的书籍最近在看设计模式,常看博客园,CSDN,搞过1年PB开发,不过并不算太深入就不评论了

    有错误望指正。

  142. 和尚
    122.225.77.*
    链接

    和尚 2013-04-25 08:55:35

    99% 的问题答不上来 但是大半年下来也改写了近十个程序 为什么 因为百度。。。

发表回复

登录 / 登录并记住我 ,登陆后便可删除或修改已发表的评论 (请注意保留评论内容)

昵称:(必填)

邮箱:(必填,仅用于Gavatar

主页:(可选)

评论内容(大于5个字符):

  1. Your Name yyyy-MM-dd HH:mm:ss

使用Live Messenger联系我