C# 当参数为null时,null安全hashcode函数返回的值是什么?

C# 当参数为null时,null安全hashcode函数返回的值是什么?,c#,null,hashcode,C#,Null,Hashcode,所以我有一个具有大量属性的对象,我需要比较它们,因此,我必须覆盖GetHashCode。这是一个令人头痛的问题,因为任何属性都可以为null,所以我重复了几行 int hashcode = 0; if (!String.IsNullOrEmpty(Property1)) hashcode ^= Property1.GetHashCode(); if (!String.IsNullOrEmpty(Property2)) hashcode ^= Property2.GetHashCode(); if

所以我有一个具有大量属性的对象,我需要比较它们,因此,我必须覆盖GetHashCode。这是一个令人头痛的问题,因为任何属性都可以为null,所以我重复了几行

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();
}
public static int NullSafeHashCode(此T可散列)
{
如果(Hashable==null){return**我不知道在这里放什么**;}
else返回Hashable.GetHashCode();
}
我知道散列码只需要被确定地创建(因此,不需要基于时间戳),使得相等的值具有相等的散列码。我非常确定(作为Foo的null)==null和(作为Bar的null)==null的计算结果为true,因此在不同类型的null对象上返回相同的hashcode应该是合理的。我知道在使用hashcode的地方,如果两个hashcode相同,那么.Equals用于验证它们是否实际上相等,因此冲突不是问题。我只是不知道null有什么好的、有意义的语法值

TL;DR?


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

由于按位或使用0保持原始值不变,我建议返回0。这将使得空值基本上是不可操作的。

传统上,您会使用
0
@问:谢谢!我知道一定有人问过类似的问题,我的谷歌浏览器不够强大。相关标记。=)