2014-04-15 49 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

相關問題