gpt4 book ai didi

C# 相等性检查

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

您为 structs 编写相等性检查的方法是什么?和 classes你创造了?

1)“完整”相等性检查是否需要大量样板代码(如 override Equalsoverride GetHashCode、通用 Equalsoperator==operator!=)?

2) 您是否明确指定您的类模拟 IEquatable<T>界面?

3) 我理解正确吗,没有实际的方法来自动应用 Equals覆盖,当我调用类似 a == b 的东西时我总是必须同时执行 Equalsoperator==成员?

最佳答案

没错,这是很多样板代码,您需要单独实现所有内容。

我会推荐:

  • 如果您要完全实现值相等,请覆盖 GetHashCodeEquals(object) - 为 == 创建重载并实现 IEquatable<T>不这样做可能会导致非常意外的行为
  • 我会一直执行 IEquatable<T>如果你重写 Equals(object)GetHashCode
  • 我只是很少重载 == 运算符
  • 为未密封的类正确实现相等是很棘手的,并且仍然会产生令人惊讶/不希望的结果。如果您需要层次结构中类型的相等性,请实现 IEqualityComparer<T>表达您感兴趣的比较。
  • 可变类型的相等通常不是一个好主意,因为两个对象可能相等,然后又不相等...如果一个对象在被用作哈希表中的键之后发生变异(以影响相等的方式) ,您将无法再次找到它。
  • 有些样板对于结构来说略有不同……但像 Marc 一样,我很少编写自己的结构。

这是一个示例实现:

using System;

public sealed class Foo : IEquatable<Foo>
{
private readonly string name;
public string Name { get { return name; } }

private readonly int value;
public int Value { get { return value; } }

public Foo(string name, int value)
{
this.name = name;
this.value = value;
}

public override bool Equals(object other)
{
return Equals(other as Foo);
}

public override int GetHashCode()
{
int hash = 17;
hash = hash * 31 + (name == null ? 0 : name.GetHashCode());
hash = hash * 31 + value;
return hash;
}

public bool Equals(Foo other)
{
if ((object) other == null)
{
return false;
}
return name == other.name && value == other.value;
}

public static bool operator ==(Foo left, Foo right)
{
return object.Equals(left, right);
}

public static bool operator !=(Foo left, Foo right)
{
return !(left == right);
}
}

是的,这是一大堆样板文件,其中很少有实现之间的变化:(

执行== 稍微效率比它可能的低,因为它会调用 Equals(object)这需要进行动态类型检查......但替代方案甚至更多样板,如下所示:

public static bool operator ==(Foo left, Foo right)
{
if ((object) left == (object) right)
{
return true;
}

// "right" being null is covered in left.Equals(right)
if ((object) left == null)
{
return false;
}
return left.Equals(right);
}

关于C# 相等性检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4420901/

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