gpt4 book ai didi

c# - GetHashCode 扩展方法

转载 作者:可可西里 更新时间:2023-11-01 08:27:14 26 4
gpt4 key购买 nike

在阅读 StackOverflow 上所有关于覆盖 GetHashCode() 的问题和答案后,我编写了以下扩展方法,以便轻松方便地覆盖 GetHashCode():

public static class ObjectExtensions
{
private const int _seedPrimeNumber = 691;
private const int _fieldPrimeNumber = 397;
public static int GetHashCodeFromFields(this object obj, params object[] fields) {
unchecked { //unchecked to prevent throwing overflow exception
int hashCode = _seedPrimeNumber;
for (int i = 0; i < fields.Length; i++)
if (fields[i] != null)
hashCode *= _fieldPrimeNumber + fields[i].GetHashCode();
return hashCode;
}
}
}

(我基本上只重构了别人贴出来的代码,因为我很喜欢它可以通用)

我是这样使用的:

    public override int GetHashCode() {
return this.GetHashCodeFromFields(field1, field2, field3);
}

你看到这段代码有什么问题吗?

最佳答案

这看起来是一个可靠的方法。

我唯一的建议是,如果您真的很关心它的性能,您可能想要为几种常见情况添加通用版本(即可能有 1-4 个参数)。这样,对于那些对象(很可能是小的、键式复合对象),您将没有构建数组以传递给方法、循环、任何通用值装箱等的开销。调用语法将完全相同,但您将针对这种情况运行稍微优化的代码。当然,在您决定是否值得进行维护权衡之前,我会对此进行一些性能测试。

像这样:

public static int GetHashCodeFromFields<T1,T2,T3,T4>(this object obj, T1 obj1, T2 obj2, T3 obj3, T4 obj4) {
int hashCode = _seedPrimeNumber;
if(obj1 != null)
hashCode *= _fieldPrimeNumber + obj1.GetHashCode();
if(obj2 != null)
hashCode *= _fieldPrimeNumber + obj2.GetHashCode();
if(obj3 != null)
hashCode *= _fieldPrimeNumber + obj3.GetHashCode();
if(obj4 != null)
hashCode *= _fieldPrimeNumber + obj4.GetHashCode();
return hashCode;
}

关于c# - GetHashCode 扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/763731/

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