为什么重写GetHashCode()会阻止INotifyPropertyChanged

本文关键字:INotifyPropertyChanged 重写 GetHashCode 为什么 | 更新日期: 2023-09-27 17:59:24

我有一个继承自INotifyPropertyChanged简单视图模型。在尝试为此视图模型创建一些自动化测试之后,我最终覆盖了Equals()GetHashCode()。我的测试通过了,所以我是一个快乐的露营者。

但是,现在我的Windows窗体数据绑定不会对视图模型中的属性更改做出反应。如果我评论我的GetHashCode()实现,那么除了我的测试之外,所有的工作都如预期的那样。

这是我的实现:

public override int GetHashCode()
{
    unchecked
    {
        var hashCode = (_subject != null ? _subject.GetHashCode() : 0);
        hashCode = (hashCode * 397) ^ (_message != null ? _message.GetHashCode() : 0);
        hashCode = (hashCode * 397) ^
                   (_body != null ? _body.GetHashCode() : 0);
        return hashCode;
    }
}

这只是ReSharper为我生成的。

为什么尽管我调用了PropertyChanged事件,但重写GetHashCode()会阻止我的数据绑定获取视图模型更改?

为什么重写GetHashCode()会阻止INotifyPropertyChanged

我总是尽量避免在生产代码中添加仅用于测试的代码。因此,既然您实现EqualsGetHashCode是为了测试目的,那么是否可以实现IEqualityComparer<T>并在单元测试中使用它来执行断言。