gpt4 book ai didi

c# - 什么时候应该在不可变结构上实现 GetHashCode?

转载 作者:行者123 更新时间:2023-11-30 19:43:59 26 4
gpt4 key购买 nike

我在这里阅读了一些与 GetHashCode 正确实现相关的问题。我没有找到的是什么时候我应该实现这个方法。

在我的具体案例中,我构建了一个简单的不可变结构:

public struct MyStruct
{
private readonly Guid m_X;
private readonly string m_Y;
private readonly string m_Z;

public Guid string X
{
get { return m_X; }
}

public string Y
{
get { return m_Y; }
}

public string Z
{
get { return m_Z; }
}

public MyStruct(Guid x, string y, string z)
{
if (x == Guid.Empty) throw new ArgumentException("x cannot be equals to Guid.Empty", "x");
if (string.IsNullOrEmpty(y)) throw new ArgumentException("y cannot be null or empty", "y");
if (string.IsNullOrEmpty(Z)) throw new ArgumentException("Z cannot be null or empty", "Z");

this.m_X = x;
this.m_Y = y;
this.m_Z = Z;
}

public override int GetHashCode()
{
var x = 17;

x = x * 23 + m_X.GetHashCode();
x = x * 23 + m_Y.GetHashCode();
x = x * 23 + m_Z.GetHashCode();

return x;
}
}

在这种情况下,我实现了 GetHashCode,但它是强制性的吗?基本 object.GetHashCode 实现本身是否可以处理这种情况?

[编辑] 背景知识:我有一些字符串需要解析和生成。此字符串是第 3 方自定义查询语言的一部分。字符串始终采用 X|Y|Z 的形式。我想通过提供此自定义结构来避免开发人员使用 string.Split 和字符串连接。最后,该结构将包含这两个补充方法:

    public override string ToString()
{
return m_X.ToString() + "|" + m_Y + "|" + m_Z;
}

public static MyString Parse(string stringToParse)
{
// implementation omitted
}

最佳答案

Isn't the base object.GetHashCode implementation itself handling this scenario?

不,ValueType.GetHashCode()实际上是在处理它——默认实现做得非常糟糕,在大多数情况下只使用第一个字段。 (在这种情况下,我不确定它会做什么,因为你的结构由于字符串引用而不是“blittable”。不能仅从字段中的简单二进制值检查相等性 - 字符串需要检查是否相等。)

对于您想要用于相等操作的任何值类型(例如,作为字典中的键),覆盖 GetHashCode 是个好主意。和 Equals(object) ,以及实现 IEquatable<T>这样相等性检查就不需要装箱了。

覆盖 GetHashCode 绝对是个坏主意不覆盖 Equals - 我很惊讶编译器没有警告你。

关于c# - 什么时候应该在不可变结构上实现 GetHashCode?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13418360/

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