当参数为 null 时,return 的 null 安全哈希码函数的好值是多少?

What is a good value for a null safe hashcode function to return when the argument is null?

所以我得到了一个具有大量属性的对象,我需要比较它们,所以,我必须覆盖 GetHashCode。这很头疼,因为任何属性都可以为空,所以我有几行重复

int hashcode = 0;
if (!String.IsNullOrEmpty(Property1)) hashcode ^= Property1.GetHashCode();
if (!String.IsNullOrEmpty(Property2)) hashcode ^= Property2.GetHashCode();
if (!String.IsNullOrEmpty(Property3)) hashcode ^= Property3.GetHashCode();
if (!String.IsNullOrEmpty(Property4)) hashcode ^= Property4.GetHashCode();
....
....
return hashcode * 11; // Use prime multiplication to help evenly distribute hashes

由于某些原因,"IsNullOrEmpty" 的重复次数让我异常焦虑,我不喜欢在我的代码中使用它。更重要的是,大多数 并非所有 属性都是字符串,因此其中一些只是 "if (obj == null)" 甚至没有正确排列。我对这个解决方案没有印象。为了纠正这个问题,我试图想出一个扩展函数,它看起来像这样

public static int NullSafeHashCode<T>(this T Hashable)
{
    if(Hashable == null) {return **I have no idea what to put here**;}
    else return Hashable.GetHashCode();
}

我知道哈希码只需要确定地创建(因此,不基于时间戳),这样相等的值就有相等的哈希码。我很确定 (null as Foo) == null 和 (null as Bar) == null 计算结果为 true,因此 return 在不同类型的 null 对象上使用相同的哈希码应该是合理的。我知道在使用哈希码的地方,如果两个哈希码相同,则 .Equals 用于验证它们实际上是否相等,因此冲突不是问题。我只是不知道 null 的一个好的、有意义的语法值是什么。

TL;博士?

看第二个代码块。当您尝试为 null 定义 HashCode 时,什么是好的 return 值?

由于按位或 0 保留原始值不变,我建议返回 0。这将使 null 值基本上成为空值。