每当我写一个新的class
或struct
可能包含一些可能需要比较的数据时,我总是实现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)
因此另一个问题浮现在脑海中:结构和类的重写实现是否应该相同?