C# 实现 IComparable 接口
本文关键字:接口 IComparable 实现 | 更新日期: 2023-09-27 17:56:05
如何正确实现IComparable接口?我有以下选择:
public class Temperature : IComparable
{
// The temperature value
protected double temperatureF;
public int CompareTo(object obj)
{
if (obj == null) return 1;
Temperature otherTemperature = obj as Temperature;
if (otherTemperature != null)
return this.temperatureF.CompareTo(otherTemperature.temperatureF);
else
throw new ArgumentException("Object is not a Temperature");
}
}
或
public class Temperature : IComparable
{
// The temperature value
protected double temperatureF;
public int CompareTo(object obj)
{
if (obj == null) return 1;
Temperature otherTemperature = obj as Temperature;
try
{
return this.temperatureF.CompareTo(otherTemperature.temperatureF);
}
catch
{
throw new ArgumentException("Object is not a Temperature");
}
}
}
哪一个是正确的方法,为什么?
在预期情况下,不应使用异常作为控制流机制,因此第一个选项更好。
您还应考虑实现泛型IComparable<Temperature>
而不是非泛型IComparable
:
public class Temperature : IComparable<Temperature>
{
// The temperature value
protected double temperatureF;
public int CompareTo(Temperature otherTemperature) {
if (otherTemperature == null) return 1;
return this.temperatureF.CompareTo(otherTemperature.temperatureF);
}
两者都在功能上是正确的,但是,我认为第一个比另一个"更正确"。
如果要转换的对象无法转换为目标类型,则"as"运算符将返回 null。在第一个示例中,您显式检查此 null 值,并引发这种情况。
但是,在第二个示例中,您允许代码崩溃(通过 NullPointerException),然后捕获该崩溃,只是抛出 ArgumentException。由于多种原因,这是一种不太有利的方法,但最大的原因是抛出异常的开销,而您可以轻松地首先检查 null。