【问题标题】:c# implement IComparable interfacec#实现IComparable接口
【发布时间】:2016-07-07 17:25:31
【问题描述】:

如何正确实现 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# asp.net .net asp.net-mvc compare


    【解决方案1】:

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

    您还应该考虑实现泛型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);
        }
    

    【讨论】:

      【解决方案2】:

      两者在功能上都是正确的,但是,我认为第一个比另一个“更正确”。

      如果您要转换的对象不能转换为目标类型,'as' 运算符将返回 null。在第一个示例中,您显式检查此 null 值,并在这种情况下抛出。

      但是在第二个示例中,您允许代码崩溃(通过 NullPointerException),然后捕获该崩溃,只是抛出 ArgumentException。出于多种原因,这是一种不太有利的方法,但最大的一个原因是抛出异常的开销,因为您可以轻松地首先检查 null。

      【讨论】:

        猜你喜欢
        • 2011-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-29
        相关资源
        最近更新 更多