你必须知道的.NET读书笔记分享——(6)知识点对比汇总

1、Equals、ReferenceEquals、==

  · Equals方法对于值类型和引用类型的定义不同,对于值类型,类型相同,并且数值相同,则Equals返回true,否则返回false。而对于引用类型,默认的行为与ReferenceEquals的行为相同,仅有两个对象指向同一个Reference的时候才返回true

  · ReferenceEquals是Object的静态方法,用于比较两个引用类型的对象是否是对于同一个对象的引用,对于值类型它总是返回false

  · 对于内置值类型,==判断的是两个对象的代数值是否相等。它会根据需要自动进行必要的类型转换,并根据两个对象的值是否相等返回true或者false,,== 默认的行为与ReferenceEquals的行为相同,仅有两个对象指向同一个Reference的时候才返回true

2、Type.GetType和typeof

  · 前者是非强类型方法,后者支持强类型

    Type tp = Type.GetType("namespace.classname");

    Type tp = typeof(namespace.classname);

  · Type.GetType支持运行时跨程序集反射,以解决动态引用,而typeof只能支持静态引用

    Assembly assembly = Assembly.LoadFrom("xx.exe");

    Type tp = assembly.GetType("...");

3、string和System.String

  · string是C#语言的基类型,System.String是FCL的基本类型,string和System.String有直接的映射关系

4、Array和ArrayList

  · Array只能存储同构对象,而ArrayList可以存储异构对象,在应用ArrayList时应考虑装箱和拆箱带来的性能影响

  · Array是一维或者多维的,而ArrayList则只能是一维的

  · Array的容量是固定的,而ArrayList的容量则是动态增加的

  · Array的下限可以设置,但ArrayList则只能是0

5、特性和属性

  · CLR允许添加类似关键字的描述声明,叫做Attribute,其本质是一个类,可为目标元素提供关联附加信息,并在运行期以反射的方式来获取附加信息

  · 属性提供了对私有字段的访问封装,在C#中以get和set访问器方法实现对可读可写属性的操作

6、接口和抽象类

  · 接口侧重于can-do,多定义对象的行为,最适合为不同的类提供通用功能,类继承接口时,除了要实现继承的接口的所有方法,还要实现该接口从其他接口中继承的所有方法

  · 抽象类侧重于is-a,既可以定义规则,也可以提供已实现的成员,适合于有族层概念的类间关系,如果要创建组件的多个版本,则创建抽象类,抽象类提供简单易行的方法来控制组件版本,通过更新基类,所有继承类都随更改自动更新,而需要新版本的接口,就必须创建一个全新的接口

    · 接口支持多继承,既可以作用于值类型,也可以作用于引用类型,抽象类不能实现多继承;  

  · 接口不能被实例化,没有构造函数,且隐式声明为public,抽象类提供多个派生类共享基类的公共定义,也不能实例化,若派生自抽象类的类没有实现所有的抽象方法,那么此类也是抽象类

  · 禁止为已经发布的接口添加新的成员;

  · 接口隔离原则强调接口应该被实现为具有单一功能的小接口,而不是实现为具有多个功能的胖接口,类对于类的依赖应建立在最小的接口之上

  · 面向对象的编程是针对接口编程,而不是针对实现编程

7、覆写和重载

  · 以virtual和abstract标记的虚方法 和抽象方法可以被覆写

  · 覆写以override标记,强调继承关系中对基类方法的重写

  · 覆写方法要求具有相同的方法签名,包括相同的方法名、相同的参数列表和相同的返回值类型

  

  · 重载是指一个类中存在多个同名的方法

  · 重载的方法参数列表不同,返回值类型可以相同或者不同

8、虚方法和抽象方法

  · 虚方法以virtual修饰并在一个或多个派生类中实现的方法,其在运行时确定根据其调用对象的类型来确定调用适当的覆写方法

  · 抽象方法以abstract修饰,可以看作是没有实现体的虚方法,并且必须在派生类中被覆写,如果一个类包括抽象方法,则该类就是一个抽象类

  

  · 用override覆写基类成员,实现派生类自己的版本;使用new表示隐藏基类的虚方法。

9、浅拷贝和深拷贝

  · 浅拷贝指对象的字段被拷贝,而字段引用的对象不会被拷贝,拷贝对象和源对象仅仅是引用名称有所不同,引用类型对象之间的赋值,就是复制一个对象引用地址的副本,而指向的对象实例仍然是同一个

  · 深拷贝指对象的字段及字段引用的对象同时被拷贝,拷贝对象和源对象相互独立,不共享任何实例数据,修改一个对象不会影响到另外一个对象,值类型之间的赋值操作就是深拷贝

10、序列化和反序列化

  · 序列化是将对象状态转换为可存储或可传输的过程

  · 反序列化是从物理介质或流上获取数据,并还原为对象的过程

11、静态构造函数和实例构造函数

  · 静态构造函数用于初始化静态类中的静态成员,包括静态字段和属性,且静态构造函数不能带参数,不能有访问修饰符,也不能被调用

  · 静态构造函数在运行库加载类时执行,实例构造函数则在实例创建时执行

  · 静态构造函数只能初始化静态成员,实例构造函数可以初始化实例成员,也可以初始化静态成员(但静态只读字段除外)

  · 静态构造函数只执行一次

  · 一个类只有一个静态构造函数,而可以有多个实例构造函数

12、静态类、静态方法和实例方法

  静态类

    · 只能包含静态成员和静态方法

    · 不可实例化

  

  · 静态方法以类名引用,实例方法以对象名引用

  · 创建实例时,不会再为类的方法分配内存,所有的实例对象共用一个类的方法代码,因此实例方法需要当前对象指针指向该方法,而静态方法可以直接调用

  静态成员使用的考虑  

    · 不需要在各个对象中重复同样的数据,从性能角度看,静态成员可以避免不必要的数据冗余

    · 静态成员提供了实现共享数据的有效机制,避免了以附加操作来处理每个对象都共享的数据信息

作者:Rocky翔
出处:http://www.cnblogs.com/RockyMyx/
本文版权归作者和博客园共有,欢迎转载,但请在文章明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2010-10-18 12:33  RockyXiang  阅读(278)  评论(0编辑  收藏  举报