2014-04-15 19 views
13

我一直在讨论Kinect传感器的一些微代码示例,并且偶然发现了下面这行。为什么要使用TimeSpan.CompareTo()而不是< >或=

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

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

我了解CompareTo()的场景,如排序,但为什么会在有条件if(),而不是更直接的方式被使用是有用的?

if (timeRemaining > this.zeroDuration) 
{ 
} 

PS:我会采取与一粒盐,如果它是任何其他来源,但考虑到代码的质量一般认为是有原因的

+0

我认为这只是一个风格的差异,但我可能是错的。 @Amicable主要是关于不同的相等比较,而不是'''比较'CompareTo'。 –

+0

对于TimeSpans,没有任何区别。我的猜测是,示例开发人员并不知道存在重载操作符。 –

+1

@Amicable null出现在字符串之前,它使用CultureInfo.CurrentCulture.CompareInfo.Compare,这意味着它将使用依赖于文化的比较。这可能意味着ß将与德国的SS相当或类似 - 不适用于TimeSpan –

回答

12

在内部做同样的事情。比较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,它接收object类型参数检查null,然后进行比较。实现这样的:从

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

的源代码:Reference Source .NET Framework 4.5.1 - Microsoft

+1

这是我正在寻找我自己的答案的链接! +1 – BlackBear

相关问题