.net的object类

    在C#中,所有类从object类派生而来。
    它可执行的方法:
        public virtual bool Equals(object obj):用于一个对象同另一个对象相比较,若两个对象相等,则返回值为ture,否则返回值为false。这种方法被标记为virtual,意味着用户可在自己的C#类中覆盖该方法。
        public virtual int GetHashCode():用于计算对象的散列码。
        public Type GetType():用于返回一个称为Type的.NET类的对象,提供当前类的有关信息。
        public virtual string ToString(): 用于返回一个代表用户对象的字符串。
        protected virtual void Finalize():当CLR的垃圾回收器破坏(释放)一个对象时,该方法可以(或不可以)被调用。
        protected object MemberwiseClone():用于创建对象的一个克隆,形成的克隆同当前对象具有相同的状态,并且返回被克隆的对象。

对象的散列码

  在前一篇读书笔记里已经提过,如果我们定义的一个类型只重写了Equals而没有重写GetHashCode方法时编译器会发出警告信息。

  一个类型为什么要同时重写Equals方法和GetHashCode方法?这是因为System.Collections.Hashtable类型的实现要求任何两个相等的对象都必须有相同的散列码值。即GetHashCode的行为依赖于Equals方法进行判断。所以,如果我们重写了Equals方法,也应该(必须)重写GetHashCode方法以确保用来判等的算法和用来计算对象散列码的算法一致。

  基本上来讲,当我们向一个Hashtable对象中添加一个“键/值对”时,其中“键对象”的散列码会首先被获取。该散列码指出了“键/值对”应该被存储在哪个“散列桶”中。当Hashtable对象需要查找某个“键”时,它会取得指定的“键对象”散列码。然后在该散列码所标识的那个“散列桶”中进一步查找和指定的“键对象”相等的“键对象”。使用这种存储和搜索的“键”算法意味着如果我们改变了Hashtable中的一个“键对象”,我们在Hashtable中将不能再找到该对象。如果我们改变一个散列表中的“键对象”,我们应该首先删除原来的“键/值对”,然后改变“键对象”,最后再将新的“键/值对”添加到散列表中。

  System.Object中实现的GetHashCode方法对于它的派生类型及其内的字段一无所知。出于这个原因,Object的GetHashCode方法返回的是一个在应用程序域范围内确保唯一的数值。该数值在整个生命周期中保证不会改变。但是,在对象被执行垃圾收集后,这个唯一的数值可以被重新利用作为一个新的对象的散列码。

  System.ValueType中实现的GetHashCode方法使用反射来返回定义在类型中第一个实例字段的散列码。这个简单的实现对于某些值类型来说可能已经够用,但是还是建议最好提供自己的实现。即使我们实现的算法同样返回一个实例字段的散列码,我们的实现也要比ValueType中实现的快一些(why?因为是直接调用的缘故?)下面是ValueType中实现的GetHashCode方法:


转载于:https://www.cnblogs.com/monkey880/archive/2008/07/11/1241132.html

你可能感兴趣的:(数据结构与算法,c#)