在 .NET 中比较引用类型时,务必理解引用相等和值相等之间的区别。引用相等检查两个引用是否指向同一对象,而值相等检查对象是否具有相同的数据。
重写相等运算符 (==) 和 Equals 方法
除非类型表示值语义(即,基于其数据视为相等的不可变对象),否则不建议重写相等运算符 (==) 和/或 Equals 方法来比较引用类型。在这种情况下,请考虑实现 System.IEquatable
IEquatable 接口
如果您的引用类型表示值语义,则实现 System.IEquatable
IComparable 接口
IComparable 主要设计用于值类型,而不是引用类型。避免将其用于引用类型。
自定义比较
与其重写相等运算符或实现 IComparable,不如考虑创建一个自定义方法来比较引用类型。使用 Equals 方法检查对象标识并重写它以比较相关的属性。
值相等的示例
以下是为 Point 类实现值相等的示例:
<code class="language-csharp">class Point : IEquatable<Point> { public int X { get; } public int Y { get; } public Point(int x = 0, int y = 0) { X = x; Y = y; } public bool Equals(Point other) { if (other is null) return false; return X.Equals(other.X) && Y.Equals(other.Y); } public override bool Equals(object obj) => Equals(obj as Point); public static bool operator ==(Point lhs, Point rhs) => object.Equals(lhs, rhs); public static bool operator !=(Point lhs, Point rhs) => !(lhs == rhs); public override int GetHashCode() => HashCode.Combine(X, Y); }</code>
结论
对于具有值语义的引用类型,请实现 System.IEquatable
以上是如何最好地比较 .NET 中的引用类型?的详细内容。更多信息请关注PHP中文网其他相关文章!