gpt4 book ai didi

c# - GetHashCode() 方法是否应该注意作为参数给出的空值?

转载 作者:太空狗 更新时间:2023-10-30 01:06:18 25 4
gpt4 key购买 nike

在某些 C# 代码中,我使用 linq GroupBy<TSource, TKey>()自定义方法 IEqualityComparer<T> .

GroupBy(x => x.SomeField, new FooComparer());

我用作分组键的字段可以是 null .因此,我不得不添加一些 null入住Equals()方法:

public bool Equals(Foo x, Foo y)
{
if (x == null && y == null)
return true;
else if (x == null && y != null)
return false;
else if (x != null && y == null)
return false;
else
return x.Id == y.Id;
}

问题是:我应该在 GetHashCode() 中做同样的事情吗?函数 ?

public int GetHashCode(Foo obj)
{
if (obj == null) //is this really needed ?
return default(int); //
else
return obj.Id;
}

我不明白的事情:即使使用 GroupBy() 中提供的空键方法,GetHashCode()永远不会用 null 调用obj 参数中的对象。有人可以向我解释为什么吗? (这是否只是“纯粹的机会”,因为 GroupBy() 的实现方式和我赋予它的元素顺序?)


编辑:

正如 caerolus 指出的那样,在 GroupBy() 中进行了一些特殊检查实现。

我 checkin 了ILSpyGroupBy()Lookup<TKey, TElement> 实现

这是相关的功能:

internal int InternalGetHashCode(TKey key)
{
if (key != null)
{
return this.comparer.GetHashCode(key) & 2147483647;
}
return 0;
}

最佳答案

根据 the documentation of IEqualityComparer<T>.GetHashCode :

ArgumentNullException
The type of obj is a reference type and obj is null.

所以这是该接口(interface)契约的一部分,因此您应该注意。通过抛出 ArgumentNullException 来实现它如果objnull .

你应该始终坚持一个接口(interface),即使你怀疑或可以证明代码永远不会触及你不关心的部分。以后的更改可能会引入依赖于该行为的代码。

关于c# - GetHashCode() 方法是否应该注意作为参数给出的空值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15948459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com