词条 | .NET程序员面试指南 |
释义 | .NET程序员面试指南作 者:朱毅 等 出 版 社:电子工业出版社 出版时间:2008-11-1 页 数:448页 开 本:16开 I S B N :9787121076756 定价:59.00元(含光盘1张) 内 容 简 介该书着重针对.NET技术职位的应聘者,在.NET框架各个技术类别中,选取最常出现在.NET面试中的问题,进行分析和解答,同时解释和剖析和该问题相关的.NET机制原理,帮助读者达到知其然更知其所以然的程度。该书几乎包揽了所有常见的面试题,从基础知识、数据库,再到比较流行的XML、测试方法和算法,是目前市场上唯一一本面试试题集锦。 全书配合了大量的图例及代码说明,非常适合正打算参加.NET技术职位的应聘和希望梳理.NET框架下技术点的读者阅读。 作者介绍朱毅 获得上海交通大学信息工程、计算机科学双学士学位及复旦大学软件工程硕士学位。在.NET技术领域拥有6年以上的开发研究经验,涉及分布式系统、B/S体系结构系统、C/S体系结构系统的架构和开发经验。曾在西门子移动通信有限公司担任项目经理,致力于企业ERP系统的架构。现任职于惠普有限公司。活跃于各大技术社区,业余时间喜欢阅读和旅游 前 言面试,是整个工作环境中的一扇门,是获得一份工作的开始,也是刚毕业的人员跨进职场的第一步。本书针对面试中经常出现的问题,还有面试中涉及的各个方面,进行了详细而完善的阐述,势必帮读者踏出面试成功的第一步。 为什么要写这样一本书? 笔者曾经去过全球顶尖的IT公司面试,结果面试主考官仅仅是聊了聊家常,最后让笔者写一个.NET的连接数据库字符串。不是吧,一个字符串?读者也许以为很简单,也许能马上想到大概什么写。可你真的能写出来吗?你写的一定是最优的数据连接字符串吗?你写的字符串能用最安全的方式访问数据库吗?虽然数据库连接字符串只有一行,通常我们都用.NET 配置工具自动完成,很好很方便,但结果呢,我们失去了思考的能力! 俗话说,机会总是垂青有准备的人。针对面试,我们需要准备什么? 网上流传着很多面试题,算法型的、操作型的,但是这些并不会出现在新的面试题中,因为没有公司会用已经知道答案的操作题。而真正万变不离其宗的就是原理,这也是很多读者都忽略的地方,但却是所有公司都最重视的地方,有关原理和基础的面试题占面试比重的80%。很多.NET培训速成班都是从实践入手,让初学者做项目来锻炼编码能力!但是中国软件需要的不是编码机器,大企业需要的是真正动脑的人,而不是动手。 该书的目的即在帮助读者高效地准备技术面试,强化基础知识和.NET工作原理。本书整理了大量的实际面试题,并且给出分析和参考答案,帮助读者复习已经掌握的知识点,并且弥补自己还不太了解的知识面。通过分析和学习这些面试题,读者就可以做到有备无患,自信而从容地问答面试官提出的每一个问题。这些面试题看似简单,却是所有面试的人准备最不足的地方。 图书特色相比同类图书,该书具有以下明显特色。 1.题型多,范围广 本书针对的面试题不再仅仅是一些算法,也不仅仅是一些代码,而是从最最基础的知识点出发,将常被开发人员忽略的技术、原理,以图和小段代码的形式进行讲解,涉及的知识点包括普通窗体开发、网络开发、数据库开发和最流行的XML开发。 2.小知识,大道理 现在的程序员起步都比较高,动手能力较强,却忽略了最最基础的知识,而面试主要针对的其实不是动手能力,而是了解应聘者的基础功底,往往很简单的一个小问题就可以难倒应聘者,这个简单问题也许只是解释下ASP.NET的原理,可你真的能说出来吗?该书从各个细微知识点入手,让读者尽览面试中的常见知识问题,并通过知识点的引申,让读者明白面试题背后真正的考核点。 3.代码规范,思维明确 大部分的面试题都除了基础知识外,都是很简单的代码,一般在半页到一页之间,真正考核的不是要你开发一个模块,而是编码的规范。重点考查的是一种编码的结构和思维。本书提供的代码严格按照大企业的编码规范,采用最合理的结构形式。 4.提供完善的售后服务 本书提供了论坛:http://www.rzchina.net,读者可以在上面提问交流。另外,论坛上还有一些小的教程、视频动画和各种技术文章,可帮助你提高开发水平。对于不明白的面试题,也可以发布到论坛上,我们会在24小时内给出明确的答案。 本书组织结构第一部分:应聘开发职位。简要地分析了.NET技术职位招聘的大致情况和流程,提供应聘者需要注意的一些细节问题。 第二部分:基础知识题。详细覆盖了关于.NET CRL机制、.NET和C#的语法、.NET常用类型和接口的使用、流的使用、内存机制等方面的面试题。 第三部分:高级特性题。覆盖了关于.NET中的委托、反射、事件、特性等机制以及.NET框架下的多线程编程等方面的面试题。 第四部分:ASP.NET和数据库。覆盖了和ASP.NET应用开发、数据库访问等方面有关的面试题。 第五部分:XML和分布式应用。覆盖了关于XML、Web Service、.NET Remoting等方面相关的面试题。 第六部分:常见算法代码及单元测试。主要覆盖了和算法代码、单元测试有关的.NET面试题。 适合读者群该书非常适合以下人员阅读: 刚毕业准备应聘.NET开发职位的应届毕业生; 在准备换工作的有工作经验的程序员; 希望通过分析、学习实际面试题来检验并且提高自身水平的程序员; .NET开发爱好者; 其他编程爱好者。 目 录第1章 应聘开发职位的技巧和禁忌 1 1.1 技术职位需要怎样的人才——了解大环境 1 1.1.1 对技术的执着和热情 1 1.1.2 对编程始终抱有认真的态度 1 1.1.3 实事求是的态度和谦逊的品质 1 1.1.4 适合应聘公司的文化 1 1.2 一份出色的个人简历——面试准备 2 1.2.1 一份简历不宜超过一页 2 1.2.2 永远准备中文简历 2 1.2.3 不要在个人简历上注明希望薪水 2 1.2.4 简历模板 2 1.3 展现自我——开始发简历 3 1.3.1 应聘渠道 3 1.3.2 应聘流程 7 1.4 真正的面试——开始面试 8 1.4.1 笔试 8 1.4.2 面试 10 1.4.3 电话面试 11 1.4.4 网络考试 11 1.5 面试中的一些禁忌 11 1.6 小结 12 第2章 .NET框架基础 13 2.1 .NET基础概念 13 2.1.1 什么是CTS、CLS和CLR 13 2.1.2 开发和运行.NET程序需要的最基本环境是什么 15 2.1.3 .NET是否支持多编程语言开发 15 2.1.4 CLR技术和COM技术的比较 17 2.1.5 什么是程序集和应用程序域 18 2.2 .NET运行机制 20 2.2.1 .NET程序被编译成什么形式的代码 20 2.2.2 JIT是如何工作的 22 2.2.3 简述程序集的加载机制 23 2.2.4 如何配置程序集的版本策略 25 2.3 生成、部署和管理 27 2.3.1 如何生成强签名的程序集 27 2.3.2 如何把程序集放入GAC中 29 2.3.3 延迟签名及其作用 30 2.3.4 程序集的版本分哪几部分 32 2.4 名企面试真题 32 2.5 小结 33 第3章 .NET类型语法基础 34 3.1 基础类型和语法 34 3.1.1 .NET中所有内建类型的基类是什么 34 3.1.2 System.Object中包含哪些方法,哪些是虚方法 35 3.1.3 值类型和引用类型的区别 37 3.1.4 简述装箱和拆箱原理 40 3.1.5 C#中是否有全局变量 43 3.1.6 struct和class的区别,struct适用哪些场合 43 3.1.7 类型的初始化器何时被调用 44 3.1.8 C#中方法的参数可以有哪几种传递方式 47 3.1.9 C#中string和String有什么区别 50 3.1.10 .NET支持哪几种可访问性级别,C#实现了其中的哪几种 50 3.1.11 简述属性的特点及属性和方法的异同 51 3.1.11 简述C#中的浅复制和深复制 54 3.1.12 简述C#中的循环语法和各自的特点 57 3.1.12 C#中的using语句有什么作用 60 3.2 内存管理和垃圾回收 62 3.2.1 简述.NET中堆栈和堆的特点和差异 62 3.2.2 执行string abc=”aaa”+”bbb”+”ccc”共分配了多少内存 64 3.2.3 .NET中GC的运行机制 66 3.2.4 Dispose方法和Finalize方法在何时被调用 67 3.2.5 GC中代(Generation)是什么,一共分几代 70 3.2.6 GC机制中如何判断一个对象是否仍在被使用 71 3.2.7 .NET的托管堆中是否可能出现内存泄漏现象 72 3.3 面向对象的实现 75 3.3.1 C#中类可以有多个父类、可以实现多个接口吗 75 3.3.2 简述C#中重写、重载和隐藏的概念 76 3.3.3 为什么在构造方法中调用虚方法会导致问题 78 3.3.4 在C#中如何声明一个类不能被继承 82 3.4 异常的处理 82 3.4.1 如何针对不同的异常进行捕捉 82 3.3.2 如何使用Conditional特性 84 3.3.3 如何避免类型转换时的异常 86 3.5 名企面试真题 88 3.6 小结 89 第4章 字符串、集合和流的使用 90 4.1 字符串处理 90 4.1.1 System.String是值类型还是引用类型 90 4.1.2 StringBuilder类型有何作用 91 4.1.3 如何在String和Byte[]对象之间进行转换 92 4.1.4 简述BASE64编码的作用以及C#中对其的支持 94 4.1.5 SecureString的实例如何被分配和释放 96 4.1.6 什么是字符串池机制 98 4.2 常用集合和泛型 99 4.2.1 Int[]是引用类型还是值类型 99 4.2.2 数组之间的如何进行转换 100 4.2.3 解释泛型的基本原理 102 4.2.4 什么是泛型的主要约束和次要约束 104 4.2.5 .NET中是否可用标准模板库(STL) 105 4.3 流和序列化 106 4.3.1 什么是流,.NET中有哪些常见的流 106 4.3.2 如何使用使用压缩流 109 4.3.3 Serializable特性有何作用 111 4.3.4 .NET提供了哪几种可进行序列化操作的类型 113 4.3.5 如何自定义序列化和反序列化的过程 116 4.4 名企面试真题 119 4.5 小结 119 第5章 常用类和接口 120 5.1 类型的基类System.Object 120 5.1.1 是否存在不继承自System.Object类型的类 120 5.1.2 在System.Object中定义的三个比较方法有何异同 122 5.1.3 如何重写GetHashCode方法 125 5.2 时间的操作System.DateTime 127 5.2.1 DateTime如何存储时间 127 5.2.2 如何在DateTime对象和字符串对象之间进行转换 127 5.2.3 什么是UTC时间,如何转换到UTC时间 130 5.3 IFormattable和IFormatProvider的使用 131 5.3.1 如何使用IFormattable接口实现格式化输出 131 5.3.2 如何告诉类型格式化输出的方式 133 5.4 管理文件和文件夹的类型 135 5.4.1 如何操作文件和文件夹 135 5.4.2 如何实现文件和文件夹的监控功能 139 5.5 .NET中的定时器 141 5.5.1 .NET提供了哪几个定时器类型 141 5.5.2 .NET的内建定时器类型是否会发生回调方法重入 146 5.6 名企面试真题 151 5.7 小结 151 第6章 .NET中的高级特性 152 6.1 委托 152 6.1.1 请解释委托的基本原理 152 6.1.2 委托回调静态方法和实例方法有何区别 154 6.1.3 什么是链式委托 154 6.1.4 链式委托的执行顺序是怎么样的 156 6.1.5 可否定义拥有返回值的方法的委托链 157 6.1.6 委托通常可以应用在哪些场合 159 6.2 事件 164 6.2.1 请解释事件的基本使用方法 165 6.2.2 事件和委托有何联系 167 6.2.3 如何设计一个带有很多事件的类型 169 6.2.4 用代码表示如下情景:猫叫、老鼠逃跑、主人惊醒 172 6.3 反射 175 6.3.1 请解释反射的基本原理和其实现的基石 176 6.3.2 .NET提供了哪些类型来实现反射 179 6.3.3 如何实现动态地发射程序集 184 6.3.4 如何利用反射来实现工厂模式 188 6.3.5 如何以较小的内存代价保存Type、Field和Method信息 194 6.4 特性 196 6.4.1 什么是特性,如何自定义一个特性 196 6.4.2 .NET中特性可以在哪些元素上使用 198 6.4.3 有哪几种方法可以获知一个元素是否申明某个特性 200 6.4.4 一个元素是否可以重复申明同一个特性 202 6.5 名企面试真题 204 6.6 小结 204 第7章 .NET多线程编程 205 7.1 多线程编程的基本概念 205 7.1.1 请解释操作系统层面上的线程和进程 205 7.1.2 多线程程序在操作系统里是并行执行的吗 206 7.1.3 什么是纤程 207 7.2 .NET中的多线程编程 208 7.2.1 如何在.NET程序中手动控制多个线程 208 7.2.2 如何使用.NET的线程池 212 7.2.3 如何查看和设置线程池的上下限 215 7.2.4 如何定义线程独享的全局数据 217 7.2.5 如何使用异步模式读取一个文件 221 7.2.6 如何阻止线程执行上下文的传递 223 7.3 多线程程序的线程同步 227 7.3.1 什么是同步块和同步块索引 227 7.3.2 C#中的lock关键字有何作用 229 7.3.3 可否使用值类型对象来实现线程同步 232 7.3.4 可否对引用类型对象自身进行同步 233 7.3.5 什么是互斥体,Mutex类型和Monitor类型的功能有何区别 235 7.4 名企面试真题 238 7.5 小结 238 第8章 ASP.NET应用开发 239 8.1 ASP.NET应用开发基础 239 8.1.1 请解释ASP.NET以什么形式运行 239 8.1.2 常见的HTTP Code有哪些 242 8.1.3 GET请求和POST请求有何区别 245 8.1.4 介绍ASP.NET的页面生存周期 247 8.2 控件和页面 249 8.2.1 什么是静态页面,什么是动态页面 249 8.2.2 请简述ViewState的功能和实现机制 251 8.2.3 Session有哪几种存储方式,之间有何区别,如何进行设置 255 8.2.4 如何嵌套使用GridView控件 259 8.2.5 列举几种实现页面跳转的方法,并说明其实现机制 263 8.2.6 请解释<%# Eval("source")"%>的功能和实现机制 270 8.2.7 ObjectDataSource控件有何作用 273 8.3 验证和安全 277 8.3.1 如何使用正则表达式来验证一个上海市电话号码 277 8.3.2 介绍ASP.NET验证控件的功能和使用方法 280 8.3.4 如何防止SQL注入式攻击 287 8.4 名企面试真题 289 8.5 小结 289 第9章 .NET中的数据库开发 290 9.1 ADO.NET和数据库程序基础 290 9.1.1 什么是关系型数据库 290 9.1.2 如何通过SQL语句来实现行列转换 291 9.1.3 ADO.NET支持哪几种数据源 293 9.2 ADO.NET和数据库的连接 295 9.2.1 请简要叙述数据库连接池的机制 295 9.2.2 如何提高连接池内连接的重用率 298 9.2.3 一个连接字符串可以包含哪些属性 300 9.2.4 CommandBehavior.CloseConnection有何作用 302 9.3 使用ADO.NET读写数据库 305 9.3.1 ADO.NET支持哪两种方式来访问关系数据库 305 9.3.3 什么是强类型的DataSet 309 9.3.4 请解释SqlDataAdapter的基本工作机制 312 9.3.5 如何自动生成SqlDataAdapter的更新命令 316 9.3.6 如何实现批量更新的功能 319 9.4 名企面试真题 321 9.5 小结 321 第10章 XML的应用和处理 322 10.1 XML的基本特性 322 10.1.1 什么是XML 322 10.1.2 简述XML的常用领域及其优势 323 10.1.3 XML中<![CDATA[ ]]>标签的作用 324 10.1.4 XML规范是否允许空的属性值 325 10.1.5 XML中如何处理诸如“<”的字符 326 10.1.6 XML中的命名空间如何使用 328 10.2 使用.NET组件读写XML 330 10.2.1 .NET中操作XML的基本类型有哪些 330 10.2.2 如何使用XmlDocument类型操作XML文档的节点和属性 334 10.2.3 如何使用XPath来指向带有属性的节点 337 10.2.4 .NET中如何验证一个XML文档的格式 338 10.2.5 .NET中XML文档和关系模式如何转换 340 10.3 利用XSLT处理XML文档 344 10.3.1 什么是XSLT,XSLT有何作用 344 10.3.2 如何使用XSLT中的模板 346 10.3.3 如何在XSLT文档中调用其他XSLT文档 349 10.3.4 如何在代码中使用XSLT文档 351 10.4 名企面试真题 353 10.5 小结 353 第11章 Web Service的开发与应用 354 11.1 SOAP和Web Service的基础概念 354 11.1.1 请简述SOAP协议 354 11.1.2 什么是WSDL,它有何作用 355 11.1.3 Web Service中如何处理附件 357 11.2 使用.NET开发Web Service 360 11.2.1 如何在.NET中创建Web Service 360 11.2.2 WebMethod特性包含哪些属性,各有何用处 363 11.2.3 如何生成Web Service代理类型 367 11.2.4 请简述.NET中Web Service的异常机制 368 11.3 Web Service的安全机制 371 11.3.1 请简要介绍WS-Security的签名机制 371 11.3.2 WS-Security规范申明了哪几种身份验证的方法 373 11.4 名企面试真题 375 11.5 小结 375 第12章 .NET Remoting分布式 应用开发 376 12.1 .NET Remoting框架基础 376 12.1.1 请简要介绍.NET Remoting的运行机制 376 12.1.2 请列举.NET Remoting机制中有哪些组件可以扩展替换 379 12.1.3 请简述.NET Remoting生存周期机制 384 12.2 使用.NET Remoting进行分布式应用开发 387 12.2.1 请介绍服务端激活模式和客户端激活模式的区别 387 12.2.2 请简述Remoting中有哪几种远程调用方式 390 12.2.3 Remoting机制中如何处理以ObjRef为参数的方法调用 393 12.2.4 请简述Remoting中配置文件的使用 397 12.2.5 如何在客户端和服务器端共享远程对象类型 400 12.3 名企面试真题 404 12.4 小结 404 第13章 代码和算法 405 13.1 基础算法题 405 13.1.1 请实现一个快速排序算法 405 13.1.2 请实现一个二分查找算法 406 13.1.3 请实现一棵二叉树的中序、后序遍历 408 13.1.4 请写出一个奇偶分割算法 413 13.1.5 请实现一个简单的最短路径算法 414 13.2 程序设计题 423 13.2.1 请编程实现斐波拉契数列问题 423 13.2.2 请设计窗口程序演示八皇后问题 425 13.3 名企面试真题 432 13.4 小结 432 第14章 .NET中的单元测试 433 14.1 单元测试基础概念 433 14.1.1 请简述单元测试的作用和其优点 433 14.1.2 请举例说明TDD开发方式的流程 434 14.1.3 请编写实现阶乘功能模块的测试用例 437 14.2 使用NUNIT进行单元测试 439 14.2.1 如何使用NUNIT来进行单元测试 439 14.2.2 如何对NUNIT的测试用例进行分类 442 14.2.3 请解释SetUp、TearDown、TestFixtureSetUp和TestFixtureTearDown 446 14.3 名企面试真题 448 14.4 小结 448 书摘7.1 多线程编程的基本概念 该节涉及的部分知识可能和.NET框架的联系并不太大,但对于掌握.NET中的多线程编程来说却十分重要。程序员在开始尝试多线程编程前,应该对这些基础知识完全掌握,并且能够在操作系统层面上理解多线程的运作方式。 7.1.1 请解释操作系统层面上的线程和进程对于多线程编程来说,线程和进程的基本概念至关重要,这让程序员明白多线程程序的实质运行情况,并且更能体会多线程应用程序所具有的优势和其具备死锁的危险。本节将回答什么是线程、什么是进程这两个基本的问题。 所涉及的知识点 · 进程的概念 · 线程的概念 · 进程和线程的区别 分析问题 1.进程的概念简单来说,进程代表了操作系统上运行着的一个应用程序。进程拥有自己的程序块,拥有独占的资源和数据,并且可被操作系统来调度。即使同一个应用程序,当被强制多次启动时,也会被安放到不同的进程之中单独运行。直观地理解进程最好的方式就是通过进程管理器浏览一下当前计算机正在运行的进程,进程浏览器中的每条记录都代表了一个活动着的进程,如图7.1所示。 并不是每个进程都会在Windows自带的进程浏览器中显示的,详细原因不属于本书的覆盖范围,有兴趣的读者可以自行参考微软公司操作系统的产品文档。 2.线程的概念线程有时候也被称为微进程或者轻量级进程,它的概念和进程十分相似,是一个可以被调度的单元,并且维护自己的堆栈和上下文环境。线程是附属于进程的,一个进程可以包含1个或者多个线程,并且同一进程内的多个线程共享一块内存块和资源。一个线程是一个操作系统可调度的基本单元,但同时它的调度受限于包含该线程的进程,也就是说操作系统首先决定下一个执行的进程,进而才会调度该进程内的线程。 3.线程和进程的区别线程和进程最大的区别在于隔离性问题。每个进程都被单独地隔离,拥有自己的内存块、独占的资源及运行数据,一个进程的崩溃不会影响到其他进程,而进程间的交互也是相当困难的。和进程不同,同一进程内的所有线程共享资源和内存块,并且一个线程可以访问、结束同一进程内的其他线程。 答案 简单来说进程代表了一个正在运行的应用程序的实体,而一个进程中可包含1个或者多个线程。关于详细的概念请参考本节的分析问题。 7.1.2 多线程程序在操作系统里是并行执行的吗编写多线程的程序,大部分情况下是希望得到并行处理带来的高效率。那在操作系统层面上多个线程的运行是否真的是并行运行的呢?这样的问题在.NET面试中也时常会出现,旨在考查应聘者关于操作系统中线程调度的基本知识。 所涉及的知识点 · 线程调度的概念 · 多处理器系统的特点 分析问题 1.线程调度回顾计算机系统发展的历史,在早期的操作系统之上,应用程序的执行完全不存在并行的概念。所有的应用都排队等候在一个单线程的队列之中,每个程序都必须等到前面的程序都安全地执行完毕后才能获得执行的权利,一个小的错误将会导致操作系统上所有程序的阻塞。在后来的操作系统中,逐渐产生了分时和进程、线程的概念。 多个线程受到操作系统的调度控制,以决定何时运行哪个线程。所谓的线程调度,是指操作系统决定如何安排线程执行顺序的算法。按照常规的分类,线程调度可分为抢占式调度和非抢占式调度两种方法。 1)抢占式调度 抢占式调度是指每个线程都只有极少的运行时间(在Windows NT内核模式下这个时间不会超过20ms),而当时间用完时该线程就会被强制暂停,保存上下文并把运行权利交给下一个线程,这样调度的结果就是所有的线程都在被快速地切换运行,使得使用者感觉所有的线程在并行运行。 2)非抢占式调度 非抢占式调度是指某个线程在运行时不会被操作系统强制暂停,它可以持续地运行直至运行告一段落并主动地交出运行权。在这样的调度模式之下,线程的运行就完全是单队列的,并且可能产生恶意程序长期霸占运行权的情况。 现在很多的操作系统,包括微软公司的Windows系统,都同时采用抢占式和非抢占式模式。对于那些优先级相当高的线程,操作系统采用非抢占式来给予充分的时间运行,而对于普通的线程,则采用抢占式模式来快速地切换执行。 2.线程的并行问题在单CPU单核的系统架构之上,线程的并行运行完全是使用者的主观体验,事实上在任一时刻只可能存在一个处于运行状态的线程。但在多CPU或多核的架构上,情况则略有不同。多CPU多核的架构允许操作系统完全并行地运行两个或多个无其他资源争用的线程,理论上这样的架构可以使运行性能整数倍地提高。 微软公司曾经提出过超线程的技术,简单来说这是一种逻辑上模拟多CPU的技术,但实际上它们却共享物理处理器和缓存。超线程对性能的提高相当有限。 答案 在单CPU的计算机架构上,任何时候只可能存在一个运行的线程,操作系统通过快速的调度轮换使使用者感觉到多线程在同时执行。而在多CPU的架构上,则可能存在完全并行运行的线程,这取决于线程之间是否争用了其他的资源。 |
随便看 |
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。