为什么使用 TimeSpan.CompareTo() 而不是 < > 或 =

Why use TimeSpan.CompareTo() rather than < > or =

提问人:Maxim Gershkovich 提问时间:4/16/2014 更新时间:4/16/2014 访问量:17646

问:

我一直在浏览 Kinect 传感器的一些 Microsoft 代码示例,并偶然发现了以下行。

TimeSpan zeroDuration = TimeSpan.FromSeconds(0.0);
TimeSpan timeRemaining = ...;

if (timeRemaining.CompareTo(this.zeroDuration) > 0)
{
}

我了解在排序等场景中如何有用,但为什么要在条件而不是更直接的方法中使用它?CompareTo()if()

if (timeRemaining > this.zeroDuration)
{
}

PS:如果它来自任何其他来源,我会持保留态度,但考虑到代码的一般质量,假设这是有原因的

C# .NET 时间跨度 比较

评论

0赞 Tim S. 4/16/2014
我认为这只是风格上的差异,但我可能是错的。@Amicable这主要是关于不同的相等比较,而不是 vs .>CompareTo
0赞 Michael Liu 4/16/2014
对于 TimeSpans,没有区别。我的猜测是示例开发人员不知道存在重载运算符。
1赞 Maxim Gershkovich 4/16/2014
@Amicable null 位于字符串之前,它使用 CultureInfo.CurrentCulture.CompareInfo.Compare,这意味着它将使用与区域性相关的比较。这可能意味着 ß 将与德国的 SS 或类似 - 不适用于 TimeSpan
0赞 usr 4/16/2014
他们可能不知道 TimeSpan 使这些运算符过载。或者他们有 Java 背景。
0赞 Hans Passant 4/16/2014
比较结构类型是很困难的,你必须知道实现。TimeSpan 实现 IComparable。接口的存在是为了鼓励程序员根据合约编写代码。因此,使用 IComparable.CompareTo() 遵循惯例。当然,你完全可以忽略它,没有人会皱眉。

答:

27赞 Habib 4/16/2014 #1

两者在内部做同样的事情。比较并返回结果。Ticks

public int CompareTo(TimeSpan value) {
    long t = value._ticks;
    if (_ticks > t) return 1;
    if (_ticks < t) return -1;
    return 0;
}

 public static bool operator <(TimeSpan t1, TimeSpan t2) {
            return t1._ticks < t2._ticks;
}

唯一的原因可能是 CompareTo 的另一个重载,它接收类型参数检查,然后进行比较。实现方式如下:objectnull

public int CompareTo(Object value) {
            if (value == null) return 1;
            if (!(value is TimeSpan))
                throw new ArgumentException(Environment.GetResourceString("Arg_MustBeTimeSpan"));
            long t = ((TimeSpan)value)._ticks;
            if (_ticks > t) return 1;
            if (_ticks < t) return -1;
            return 0;
        }

源代码来自:参考源 .NET Framework 4.5.1 - Microsoft

评论

4赞 BlackBear 4/16/2014
这就是我一直在寻找自己的答案的链接!+1