每当我编写一个新的可能需要比较数据的类或结构体时,我总是实现IEquatable接口,因为这会为类/结构体提供强类型的.Equals(T other)方法。
示例:
除了提供
选项2是使用"as"关键字:
我的提问是,使用强制转换会抛出异常,如果
编辑:正如许多SO用户所指出的那样,结构体不能为null,因此第二个选项不适用于结构体。因此另一个问题浮现:对于结构体和类,重写实现
示例:
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用户所指出的那样,结构体不能为null,因此第二个选项不适用于结构体。因此另一个问题浮现:对于结构体和类,重写实现
.Equals(object obj)
应该相同吗?
Equals(Radius)
方法如果other
为 null,应该返回 false,否则将会抛出空输入的异常。 - cdhowieEquals
方法不接受Radius?
类型的参数,它需要一个Radius
类型的参数。 - Servyas
是有意义的,但是由于它在逻辑上不可为空,因此您所做的工作实际上消除了获得的优势。这两个解决方案相当等效,差异几乎完全是主观偏好,没有更多的区别。 - Servy