Microsoft.Net框架程序设计学习笔记(8):对象散列码、对象克隆
时间:2011-03-25 来源:辛勤的代码工
对象的散列码:
object提供了一个GetHashCode虚方法,我们可以从任何对象上得到一个Int32类型的散列码。
如果我们定义了一个类型,且重写了Equals方法,我们就应该重写GetHashCode方法。因为Hashtable类型的实现要求任何两个相等的对象都必须有相同的散列值。
object的GetHashCode方法返回的是一个在应用程序域范围内确保唯一的数值,该数值在对象的整个生存期中保证不会改变。但在对象被执行垃圾收集后,这个唯一的数值可以被重新利用作为一个新的对象的散列码。
ValueType中实现的GetHashCode方法使用反射来返回定义在类型中第一个实例字段的散列码。
我们不应该持久化散列码值,原因是散列码值可能会改变。如,一个类型的下一个版本可能会使用不同的算法来计算对象的散列码。
对象克隆:
如果希望自己的实例被克隆,该类应该实现ICloneable接口,它的定义如下:
public interface ICloneable
{
Object Clone();
}
我们必须自己决定实现一个浅拷贝还是深拷贝。
浅拷贝:当对象的字段值被拷贝时,字段引用的对象不会被拷贝。例如:一个对象有一个指向字符串的字段,浅拷贝后,两个对象将引用同一个字符串。
深拷贝:对对象实例中字段引用的对象也进行拷贝的一种方式。例如:一个对象有一个指向字符串的字段,深拷贝后,新对象将引用一个新的字符串。原来的对象和新创建的对象不会共享任何东西;改变一个对象对另一个对象没有任何影响。
实现浅拷贝的方法:
只需在Clone方法中调用Object的受保护方法MemberwiseClone即可,如下所示:
class MyType : ICloneableMemberwiseClone方法首先会为新对象分配内存,然后会一年多来类型中所有的实例字段,且将原对象中所有的位拷贝到新对象中。它不会为新对象调用构造器,而只是保证它的状态和原对象一致。
{
public object Clone()
{
return MemberwiseClone();
}
}