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");
            }
        }
     }

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

C# 实现 IComparable 接口

在预期情况下,不应使用异常作为控制流机制,因此第一个选项更好。

您还应考虑实现泛型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。