《.NET程序员面试指南》 - 书摘精要 博客分类: .net .net框架asp.netc#
(P12) 应聘者应该避免那些拥有不适合自己的公司文化的企业,不适合的文化环境将很大程度地阻碍员工的职业发展;
(P20) 笔试题一定要仔细考虑,用最简单的语言说出考题的答案,不要写太多,越多说明能力越欠缺;
(P23) 公共语言规范 (CLS) 是 CTS 的一个子集, 它定义了希望缩写在 .NET 平台上运行的程序的语言所需符合的最小规范;
(P24)
公共语言运行库 (CLR) 是一个 CLI 的实现,包含了 .NET 运行引擎和符合 CLI 的类库;
通用类型系统 (CTS) 包含在微软公司提交的 CLI 规范中,定义了一个可以在 CLR 上运行的类型规范;
(P23) 公共语言基础 (CLI) 是微软公司向 ECMA 提交的一份语言和数据格式规范,CLR 是目前唯一一个公共语言基础的实现版本;
(P28)
程序集 (Accembly) 是一个或多个模块和资源文件的集合。当一个程序集被打包形成时,它不仅会包含所有的原始文件内容,也会添加一个程序集清单,该清单包含了程序集的版本号、语言、发布者、导入类型等信息;
包含了程序清单的那个文件对使用该程序集来说是必需的;
(P29) 在多个应用程序域间通信是非常困难的;
(P31) 在 CLR 运行程序集的时候,根据需要会对 IL 代码进行第二次编译,这个过程被称为实时编译 (JIT);
(P37) CLR 支持在3个级别上设定版本策略,依次是:应用程序策略、发行者策略和计算机策略。所有策略的设置都是通过修改配置文件来实现;
(P38) 现在常用的非对称算法有 RSA 算法 和 DSA 算法;
(P40) 只有带有公钥的强签名程序集才能被部署到 GAC 中去;
(P46) System.ValueType 已经实现了类型内容的比较,所以所有值类型的比较都是内容比较而非引用比较,由于值类型的特点,所有值类型的引用比较都将返回 false ;
(P47)
System.Object 的 ToString()方法的实现,事实上就是利用了 GetType()方法;
笔者建议在大多数情况下都不要重写 GetHashCode()方法,除非自信能够提供准确而更高效的 GetHashCode()算法;
(P49) 堆栈的空间相对有限,但运行效率却比堆高得多;
(P51) 引用类型对象拥有的成员:类型对象指针和同步块引用;
(P52) 对于堆上空间的操作,速度相对于堆栈的操作慢得多,并且可能引发垃圾回收,这些都将大规模地影响系统的性能;
(P53) 装想和拆箱本质上是值类型在转换到 System.Object 时引发的堆栈和堆的一系列移动操作。装箱时值类型从堆栈上被复制到堆上,而拆箱时从堆上复制到堆栈上;
(P55) 类型初始化器不同于构造方法,初始化器不能被显式地调用,并且每个类型只能有一个类型初始化器;
(P57) 类型的初始化器是指具有和类型相同名字,无参数、无返回并且以 static 定义的方法;
(P59) “out”关键字不关心参数在传入前是否被初始化,但要求参数在返回前被初始化;
(P61) C# 中不同类型成员的默认可访问性级别:
1.
类型: enum
C#中默认的可访问性级别: public
可设置的可访问性级别: 不可设置
2.类型: class
C#中默认的可访问性级别: private
可设置的可访问性级别: public、 protected、 internal、 private、 internal proteccted
3.
类型: interface
C#中默认的可访问性级别: public
可设置的可访问性级别: 不可设置
4.
类型: struct
C#中默认的可访问性级别: private
可设置的可访问性级别: public、 internal、 private
(P63) .NET设计团队添加属性的本意并非代替方法,而是代替暴露的内部成员;
(P67) 一般可被继承的类型应该避免实现 ICloneable 接口,因为这样做将强制所有的子类型都需要实现 ICloneable 接口,否则将使类型的深复制不能覆盖子类的新成员;
(P70)
当 using 可以被使用时,笔者建议读者尽量使用 using 语句。至今为止,笔者发现它带给程序的只有优点,而没有任何弊端;
任何带有非托管资源的类型,都有必要实现 IDisposable 的 Dispose()方法,并且在使用完这些类型后需要手动的调用对象的 Dispose 方法来释放对象中的非托管资源;
(P80) 根据 .NET 的垃圾回收机制,0代、1代和2代的初始分配空间分别为 256KB、2MB 和 10MB;
(P84) .NET 托管堆内可能出现严重内存泄漏现象,主要产生原因有:大对象的频繁分配和释放,不恰当地保留引用和错误的 Finalize()方法;
(P102) 一旦 StringBuilder 的 ToString()方法被调用后,最终的字符串就被生成,而随后的操作将导致一个新的字符串对象生成;
(P106) Convert 类型在转换失败时将直接抛出异常,读者在任何时刻都必须把 Convert 类型的操作语句放入 try catch 块中;
(P109) 字符串池机制致力于改善程序的性能。 CLR 会保留程序中出现过的字符串对象的集合,并且在需要新的字符串时,先检查已有的集合,在查找成功时返回已有对象的引用。字符串机制可以通过程序集元数据特性进行控制,C# 默认的机制是打开字符串机制;
(P113) 带泛型参数的类型同样是一个确定的类型,在不被指定的情况下,它直接继承自 System.Object类型,并且可以派生出其它类型;
(P116) Wintellect 团队为 .NET 开发了 STL 类库 Power Collection ,这个类库可以免费获得,.NET 程序员可以并且被鼓励使用标准模板库 (STL);
(P121) .NET 提供的 DeflateStream 类型和 GZipStream 类型压缩算法并不出色,并且也不能调整压缩率。有些第三方的组件,例如 SharpZipLib 实现了更搞笑的压缩解压算法;
(P123)
当一个基类使用了 Serializable 特性后,并不意味着其所有的子类都能被序列化。事实上,程序员必须为每个子类都添加 Serializable 特性来保证其能被正确的序列化;
Serializable 和 NonSerialized 特性在 XmlSerializer 类型对象的操作中完全不起作用,取而代之的是 XmlIgnore 属性;
(P123)
使用 XmlSerializer 序列化的对象类型必须显式地拥有一个无参的公共构造方法;
XmlSerializer 只能序列化公共成员变量;
(P132) 通过运用 ILasm.exe 的 noautoinherit 开关,可以生成不从 System.Object 继承的类型;
(P149) FileInfo 和 DirectoryInfo 主要的功能在于操作文件和文件夹在文件系统中的结构,完成诸如创建、复制、读取信息、移动、判断是否存在、删除等功能;
(P163) 委托的调用就是执行了在定义委托时所生成的 Invoke 方法;
(P164) 当委托绑定静态方法时,内部的对象成员变量 _target 将会被设置成 null ,而当委托绑定实例方法时, _target 将会设置成指向该实例方法所属类型的一个实例对象,当委托被执行时,该对象实例将被用来调用实例方法;
(P167) System.Delegate 有两个内部成员: _target 和 _MethodPtr 。System.Multicast.Delegate 继承了这两个成员,并且添加了一个 _prev 成员,该成员是一个委托的引用变量,当某个委托被串联到当前委托的后面时,该成员会被设置指向那个后续委托实例对象;
(P179) 事件是一个委托类型,该委托类型的方法无返回值,并且拥有两个参数: object 和 TEventArg。
(P216) 每个进程都被单独地隔离,拥有自己地内存块,独占的资源及运行数据,一个进程的崩溃不会影响到其它进程,而进程间的交互也是相当困难的。和进程不同,同一进程内的所有线程共享资源和内存块,并且一个线程可以访问,结束同一进程内的其它线程;
(P243) 笔者建议读者使用 lock 关键字,并且永远不要手动使用 Monitor.Enter() 和 Monitor.Exit() 方法;
(P245) 应该完全避免使用 this 对象和当前类型对象作为同步对象,而应该在类型中定义私有的同步对象,同时应该使用 block 而不是 Monitor 类型,这样可以有效地减少同步块不被释放的情况;
(P248)
1. Mutex 使用的是操作系统的内核对象,而 Monitor 类型的同步机制完全在 .NET 框架中实现;
2. Monitor 类型智能同步同一应用程序域中的线程,而 Mutex 类型却可以跨越应用程序与和进程;
(P253)
常用 Http Code :
100 成功,可以继续请求;
101 服务器已更改;
200 请求结束;
201 请求完成,并且新资源被创建;
202 请求被接受,但处理尚未完成。请求可能不一定会最终完成;
204 服务器端已经实现了请求,但是没有返回新的消息;
206 部分 GET 请求完成;
300 存在多个可用资源,不能确定使用哪个资源;
301 请求对象已经被永久移动到新的 URI ;
302 请求对象暂时被移动到新的 URI ;
303 请求资源在另一 URI 上,可以以一个新的 GET 方法请求该 URI 上的资源;
304 如果客户端成功执行了条件 GET 请求,而对应文件自 If - Modified - Since 域所指定的日期以来就没有更新过;
305 所请求的资源必须使用特定代理来访问;
307 请求被暂时地重定向;
400 非法的请求,请求包含非法字符或语句;
401 访问被拒绝,服务器要求客户端提供认证;
402 暂时没有使用,将来可能被用来作为要求支付;
403 服务器理解请求,但是拒绝实现该请求;
404 请求资源没有找到;
405 请求的资源不能通过该 URI 访问;
405 请求的资源无法通过指定的编码和格式返回给请求者;
407 请求的资源需要通过代理访问,并且客户端需要先通过代理认证;
408 服务器等待超时;
409 客户端需要发请求并包含更多信息;
410 所请求资源已经被移除或者无法获得;
411 需要客户端在请求的头中添加合法的内容长度字段;
412 一个或多个定义在请求中的先决条件在服务器测试不成立;
413 请求的资源不大,服务器拒绝;
414 请求 URI 过长;
415 请求的媒体类型不被请求支持;
500 服务器端出错;
501 服务器不支持该请求;
502 充当网关或代理的服务器从要发送请求的上游服务器收到非法的回应;
503 服务器暂时不可用;
504 等待网关超时;
505 不支持请求使用的 HTPP 协议版本;
(P255)
HTTP 协议设计时, GET 被作为一种向服务器申请资源的请求,而 POST 则作为一种向服务器发送数据的请求;
对于 ASP.NET 来说,当新建一个表单时,默认的请求方式是 POST;
(P276) Server.Execute()方法实现的不是页面的跳转的功能,而是页面的呼叫功能;
(P347) XPath 即为 XML 路径语言 (XML Path Language) ,它是一种同来确定 XML 文档中某部分位置的语言;
(P348) 自 XML 发展至今,曾出现三种被广泛使用的 XML 格式定义语言: DTD、XDR 和 XSD;