c# - 在不可变类型的构造函数中生成 HashCode

标签 c# .net constructor

我对不可变类型的 HashCode 有一些疑问。

  • 我可以在构造函数中“预先”生成不可变类型的 HashCode 还是有任何理由不这样做?
  • 当调用 GetHashCode() 方法时,我是否应该始终再次生成哈希码?

这是一个示例类:

    public class Id  {

        private readonly object _value;

        private readonly int _hash = -1;


        public Id( object value ) {
          _value = value;
          _hash = ( int ) ( 7 * value.GetType().GetHashCode() + 7 + 7 * _value.GetHashCode() );
        }

        public object Value {
          get {
            return _value;
          }
        }

        public override int GetHashCode() {
          return _hash;
        }

        public override bool Equals( object obj ) {
          Id other = obj as Id;

          if ( other == null ) {
            return false;
          }

          return this.GetHashCode() == other.GetHashCode();
        }
        }

最佳答案

您可以预先生成哈希码,但为什么呢?只需在需要时生成它(在 GetHashCode 中)然后可能存储它 - 大多数对象从来不需要具有哈希,因此它只会减慢程序。

Should i always generate the Hashcode again, when the method GetHashCode() is called?

不可变对象(immutable对象)的哈希码应该始终相同,因此无论您是再次生成它还是存储它,它都不会产生任何影响,除非存储会提高性能。

注意:您不应通过比较 HashCode 来定义 Equals - 两个不同的对象可能具有相同的 HashCode(哈希碰撞)。

关于c# - 在不可变类型的构造函数中生成 HashCode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/910149/

相关文章:

c# - 实现 C# 控制台应用程序的正确方法?

c# - 为 Microsoft Bot-Builder 自定义 ReceiptCard

c# - 通知 ViewModel 静态模型的变化

c# - 如何更改 .NET Framework Bootstrap 包?

java - 如何使用对象内部的一些属性来使用它们?

javascript - 如何使用构造函数方法创建一个 javascript 类来初始化新对象/实例?

C# 对象初始化选项

c# - 在 MongoDB 中使用 MongoDBRef 引用多个外国文档

.net - WhereNot linq 表达式

c# - 将 Winform 应用程序转换为 WPF 应用程序