[英]c# struct with no reference types
考虑一个不包含任何引用字段的结构(只有基本类型和其他结构)。
考虑这个结构将在集合中使用,我希望它的行为类似于值类型(即int)。
特别是如果您的值类型包含作为引用类型的字段,您应该重写Equals(Object)方法。 这可以提高性能并使您能够更接近地表示类型的相等含义。
最好实现IEquatable以避免装箱(默认Equals接受一个对象类型,因此你的struct必须经过装箱才能适应这种类型)。 集合(数组,字典等)通常会检查其成员是否实现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进行比较,您也应该这样做。
所以不,实现==和!=是没有必要的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.