如何实现IComparable接口的正确方法? 我有以下选择:
sWSIKey
或
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");
}
}
哪一个是正确的方法,为什么?
答案 0 :(得分:3)
在预期的情况下,不应该使用异常作为控制流机制,因为第一个选项更好。
您还应考虑实施通用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);
}
答案 1 :(得分:1)
两者在功能上都是正确的,但是,我认为第一个比另一个更“正确”。
如果您要投射的对象无法强制转换为目标类型,则“as”运算符将返回null。在第一个示例中,您将显式检查此null值,并抛出该情况。
但是在第二个示例中,您允许代码崩溃(通过NullPointerException),然后捕获该崩溃,仅抛出ArgumentException。出于多种原因,这是一种不太有利的方法,但最大的一种方法是在首先检查空值时抛出异常的开销。