`
0428loveyu
  • 浏览: 28533 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

《你必须知道的.NET》 - 书摘精要

 
阅读更多

(P7) 对象中的多态主要包括以下两种情况 —— 接口实现多态、抽象类实现多态;

(P11) 在子类中实现虚函数的方式,称为方法的动态绑定;

(P15)

关注对象原则:调用子类还是父类的方法,取决于创建对象是子类对象还是父类对象,而不是它的引用类型;

执行就近原则,对于同名字段或者方法,编译器是按照其顺序查找来引用的,也就是首先访问离它创建最近的字段或者方法;

(P17)

聚合分为三种类型 —— 无聚合、共享、复合 (其耦合度逐级递增)

聚合关系是一种 has-a 式的关系,耦合度没有继承关系高;

(P18) 面向对象的基本原则 —— 多聚合,少继承、 低耦合,高内聚;

(P25) 只读字段只能在构造函数中被赋值;

(P42) 动态绑定在运行期通过检查虚拟方法表来确定动态关联覆写的方法,一般以继承和虚方法来实现;

(P56) “美的东西比丑的东西创建起来更廉价,也要更快捷。”

(P58)

—— 设计原则 ——

1.

设计原则: 单一职责原则

英文表达: SRP - Single Responsibility Principle

说  明: 一个类应该仅有一个引起它变化的原因,不要将变化原因不同的职责封装在一起,而应该分离;

2.

设计原则: 开放封闭原则

英文表达: OCP - Open Closed Principle

说  明: 软件实体应对修改关闭,对扩展开放;

3.

设计原则: 依赖倒置原则

英文表达: DIP - Dependency Inversion Principle

说  明: 依赖于抽象,而不要依赖于具体,因为抽象相对稳定;

4.

设计原则: 接口隔离原则

英文表达: ISP - Interface Segregation Principle

说  明: 尽量应用专门的接口,而不是单一的总接口,接口应该面向用户,将依赖建立在最小的接口上;

5.

设计原则: Liskov替换原则

英文表达: LSP - Liskov Substitution Principle

说  明: 子类必须能够替换父类;

6.

设计原则: 合成/聚合复用原则

英文表达: CARP - Composite Aggregate Reuse Principle

说  明: 在新对象中聚合已有对象,使之成为新对象的成员,从而通过操作这些对象达到复用的目的。合成方式较继承方式耦合更松散,所以应该少继承、多聚合;

7.

设计原则: 迪米特法则

英文表达: LOD - Law of Demeter

说  明: 又叫最少知识原则,指软件实体应该尽可能少的和其他软件实体发生相互作用;

(P60) SRP原则的核心就是要求对类的改变只能是一个,对于违反这一原则的类应该进行重构;

(P71)

拒绝滥用抽象,只将经常变化的部分进行抽象;

将容易变化的因素进行抽象处理,可以改善类的内聚性;

(P75) 原则是不变的,而方法是灵活的;

(P127)

Convert —— 提供了灵活的类型转换封装;

Parse —— 适用于将字符串转换为其他的基本类型;

(P128) 值类型实例对象要么在堆栈上,要么内联在结构中;

(P132)

值类型实例总是分配在它声明的地方,声明为局部变量时其被分配在堆栈上,声明为引用类型成员时其被分配到托管堆上;

引用类型实例化则总是分配在托管堆上;

(P134) 值类型都继承自 System.ValueType ,而 System.ValueType 又继承自 System.Object ,其主要区别是 ValueType 重写了 Equals 方法,实现对值类型按照实例值比较而不是引用地址来比较;

(P136) MSDN 中建议以类型的大小作为选择值类型或者引用类型的决定性因素;

(P153)

引用类型参数的按值传递,传递的是参数本身的值;

引用类型参数的按引用传递,传递的是参数的地址;

(P155) 不管是值类型还是引用类型,按引用传递必须以 ref 或者 out 关键字来修饰;

(P159)

装箱就是值类型数据转化为无类型的引用对象;

拆箱就是获取已装箱对象中来自值类型部分字段的地址;

装箱和拆箱并非完全对称的互逆操作,拆箱在执行上并不包含字段的拷贝过程;

(P163) 拆箱必须保证执行后的结果是原来未装箱时的类型,否则将抛出 InvalidCastException 异常;

(P174)

堆栈主要由操作系统管理,而不受垃圾收集器的控制,当值类型实例所在方法结束时,其存储单位自动释放。栈的执行效率高,但存储容量有限;

GC对,用于分配小对象实例。如果引用类型对象的实例大小小于85000字节,实例将被分配在GC堆上;

LOH (Large Object Heap)堆,用于分配大对象实例;

(P194) 任何重写了 Finalize 方法的类型实例都应实现 Dispose 方法,来实现更加灵活的资源清理控制;

(P201) CLR 在设计上为了提升 string 类型性能考虑,实现了一种称为“字符串驻留”的机制,从而实现了相同字符串可能共享内存空间;

(P217)

base 关键字 —— 调用基类上已被其它方法重写的方法、指定创建派生类实例时应调用的基类构造函数;

this 关键字 —— 限定被相似的名称隐藏成员、将对象作为参数传递到其它方法、声明索引器;

(P223) base 是为了实现多态而设计的;

(P256) const 常数在定义时必须指定初始值;

(P257) 静态只读字段的初始化,必须在定义时或者静态无参构造函数中执行;

(P267) struct 没有自定义的默认无参构造函数,默认无参构造函数只是简单地把所有值初始化为它的0等价值;

(P277) DllImport 特性,可以引入对 Win32 API 函数的调用;

(P290)

1. 如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单易行的方法来控制组件版本。通过更新基类,所有继承类都随更改自动更新。另一方面,接口一旦创建就不能更改。如果需要接口的新版本,必须创建一个全新的接口;

2. 如果创建的功能将在大范围的全异对象间使用,则使用接口。抽象类应主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能;

3. 如果要设计小而简练的功能块,则使用接口。如果要设计大的功能单元,则使用抽象类;

4. 如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。抽象类允许部分实现类,而接口不包含任何成员的实现;

(P297) .NET 2.0 引入泛型技术,使得相同的参数列表、相同的返回值类型的情况也可以构成重载;

(P301)

使用 override 表示覆写基类成员,实现派生类自己的版本;使用 new 表示隐藏基类的虚方法,也就是该方法独立于基类的方法;

派生类方法如果未被定义为 override 或 new ,则编译器将发出警告,并默认定义为带 new 的方法;

(P313) 静态构造函数,只能对静态成员进行初始化操作,不能作用于非静态成员;而实例构造函数,可以初始化实例成员,也可以初始化静态成员,但是静态只读字段除外;

(P329)

Dictionary<TKey, TValue> 泛型类对应于 Hashtable 类;

List<T> 泛型类对应于 ArrayList 类;

SortedList<T> 泛型类对应于 SortedList 类;

(P370) Enum.Parse() —— 间接完成整数类型向枚举类型的转换;

(P407) 技术的学习在于应用而不在于全面;

(P418) StreamReader 和 StreamWriter —— StreamReader 以特定编码从字节流中读取字符, StreamWriter 以特定的编码向流中写入数据,它们的默认编码均为 UTF-8 格式;

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics