gpt4 book ai didi

c# - IEquatable - C# 中 .Equals(object obj) 的最佳实践覆盖

转载 作者:太空狗 更新时间:2023-10-30 00:15:00 24 4
gpt4 key购买 nike

每当我写一个新的classstruct这可能包含一些数据,可能需要比较,我总是实现 IEquatable<T>因为这提供了 class/struct强类型 .Equals(T other)方法。

示例:

public struct Radius : IEquatable<Radius>
{
public Int32 TopLeft { get; set; }
public Int32 TopRight { get; set; }
public Int32 BottomLeft { get; set; }
public Int32 BottomRight { get; set; }

public bool Equals(Radius other)
{
return this.TopLeft == other.TopLeft
&& this.TopRight == other.TopRight
&& this.BottomLeft == other.BottomLeft
&& this.BottomRight == other.BottomRight;
}
}

以及为 .Equals(Radius other) 提供实现,我真的也应该重写默认实现 ( .Equals(object obj) )

这里我有两个选择,我的问题是,这些实现中哪个更好?

选项 1 是使用转换:

public override bool Equals(object obj)
{
return this.Equals((Radius)obj);
}

选项 2 是使用“as”关键字:

public override bool Equals(object obj)
{
return this.Equals(obj as Radius);
}

我问这个的原因是,如果 obj,使用转换将抛出异常无法转换为 Radius ,而 as将解析为 null如果它不能被转换,那么它只检查 this反对null , 不抛出异常;那么是抛出异常更好,还是只返回 false 更好? ?

编辑:正如很多 SO'ers 指出的那样,结构不能为空,因此第二个选项不适用于结构。因此,我想到了另一个问题:是否应该重写 .Equals(object obj) 的实现?结构和类是否相同?

最佳答案

Equals() 方法 must never throw an exception .

不同类型的对象只是不相等。

引用documentation :

Implementations of Equals must not throw exceptions; they should always return a value. For example, if obj is null, the Equals method should return false instead of throwing an ArgumentNullException.

关于c# - IEquatable<T> - C# 中 .Equals(object obj) 的最佳实践覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18107584/

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