考虑一个不包含任何引用字段的结构(仅基本类型和其他结构)。
考虑此结构将用于集合中,我希望它的行为类似于值类型(即int)。
答案 0 :(得分:3)
尤其是如果您的值类型包含引用的字段 类型,则应重写Equals(Object)方法。这样可以改善 性能,使您能够更紧密地代表 类型相等。
最好实现IEquatable以避免装箱(默认Equals接受对象类型,因此您的结构将必须进行装箱以适合该类型)。 集合(数组,字典等)通常会检查其成员是否实现IEquatable,并将使用IEquatable.Equals,因此最好实现它。 还建议实现默认的Equals(来自System.Object)并直接指向IEquatable.Equals实现。 示例:
struct MyStruct : IEquatable<MyStruct>
{
public int A { get; set; }
public int B { get; set; }
public bool Equals(MyStruct other)
{
return A == other.A && B == other.B;
}
public override bool Equals(object obj)
{
if (!(obj is MyStruct)) return false;
return ((MyStruct)obj).Equals(this);
}
public override int GetHashCode()
{
return (A, B).GetHashCode();
}
}
我还提供了一个如何实现GetHashCode的示例,最好的方法是使用Tuple的实现。
再次执行==和!=由您决定 标准库(System,System.Collections等)使用System.Equals或IEquatable.Equals进行比较,您也应该这样做。
因此,不需要==和!=。