• GetHashCode注意点


    GetHashCode注意点:

    1. GetHashCode 方法的默认实现不保证针对不同的对象返回唯一值。而且,.NET Framework 不保证 GetHashCode 方法的默认实现以及它所返回的值在不同版本的 .NET Framework 中是相同的。因此,在进行哈希运算时,该方法的默认实现不得用作唯一对象标识符。
    2. GetHashCode 方法可以由派生类型重写。值类型必须重写此方法,以提供适合该类型的哈希函数和在哈希表中提供有用的分布。为了获得最佳结果,哈希代码必须基于实例字段或属性(而非静态字段或属性)的值。
    3. 如果两个对象的比较结果相等,则每个对象的 GetHashCode 方法都必须返回同一个值。但是,如果两个对象的比较结果不相等,则这两个对象的 GetHashCode 方法不一定返回不同的值。
    4. 一个对象的 GetHashCode 方法必须总是返回同一个哈希代码,但前提是没有修改过对象状态,对象状态用来确定对象的 Equals 方法的返回值。请注意,这仅适用于应用程序的当前执行,再次运行该应用程序时可能会返回另一个哈希代码。
    5. 为了获得最佳性能,哈希函数必须为所有输入生成随机分布。
    6. String 类提供的 GetHashCode 方法的实现为相同的字符串值返回相同的哈希代码。因此,如果两个 String 对象表示相同的字符串值,则它们返回相同的哈希代码。

    例如:string str1 = "Hello world";

    string str2 = "Hello world";

    则str1.GetHashCode() == str2.GetHashCode().

    1. 重写 GetHashCode 的派生类还必须重写 Equals,以保证被视为相等的两个对象具有相同的哈希代码;否则,Hashtable 类型可能无法正常工作。

      例如通过Reflector查看int类型的GetHashCode的实现如下:

      public override int GetHashCode()
      

      {
      
      return this;

      }

      更常见的是当一个类型含有多个字段时,用OR运算来产生HashCode,例如Point结构体:

      public override int GetHashCode()
      

      {
      

      return (this.x ^ this.y);

      }
      

      又如下面的例子:

      using System;

      public class SomeType {

      public override int GetHashCode() {

      return 0;

      }

      }

      public class AnotherType {

      public override int GetHashCode() {

      return 1;

      }

      }

      public class LastType {

      public override int GetHashCode() {

      return 2;

      }

      }

      public class MyClass {

      SomeType a = new SomeType();

      AnotherType b = new AnotherType();

      LastType c = new LastType();

      public override int GetHashCode () {

      return a.GetHashCode() ^ b.GetHashCode() ^ c.GetHashCode();

      }

      }

  • 相关阅读:
    VC++中使用内存映射文件处理大文件
    802.1x协议解析
    Jscript中window.setInterval和window.setTimeout区别
    在C#中使用代理的方式触发事件
    JavaScript实用的一些技巧
    控制C#编的程序内存的占用
    纯C#钩子实现及应用(转)
    DES的建立过程
    C# 显示占用内存
    解决“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题”
  • 原文地址:https://www.cnblogs.com/bear831204/p/1387243.html
Copyright © 2020-2023  润新知