c#实现IComparable接口

时间:2016-07-07 17:25:32

标签: c# asp.net .net asp.net-mvc compare

如何实现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");
    }
}

哪一个是正确的方法,为什么?

2 个答案:

答案 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。出于多种原因,这是一种不太有利的方法,但最大的一种方法是在首先检查空值时抛出异常的开销。