2014-04-15 21 views
13

Przeszukałem kilka próbek Microsoft kodu czujnika Kinect i natknąłem się na następującą linię.Dlaczego warto używać TimeSpan.CompareTo() zamiast < > lub =

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

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

rozumiem jak CompareTo() jest przydatna w sytuacjach, takich jak sortowanie, ale dlaczego miałby on być stosowany w ramach warunkowego if() zamiast bardziej bezpośrednie podejście?

if (timeRemaining > this.zeroDuration) 
{ 
} 

PS: wziąłbym go z przymrużeniem oka, czy to z innego źródła, ale biorąc pod uwagę ogólną jakość kodu zakładamy, że nie ma powodu

+0

będę zakładać, że to tylko różnica stylistyczna, ale mogę się mylić. @Amicable to głównie o różnych porównaniach równości, a nie '>' vs 'PorównajTo'. –

+0

Dla TimeSpans nie ma różnicy. Domyślam się, że przykładowy dev nie był świadomy istnienia przeciążonych operatorów. –

+1

@Amicable null występuje przed ciągiem znaków i korzysta z CultureInfo.CurrentCulture.CompareInfo.Compare, co oznacza, że ​​użyje porównania zależnego od kultury. Może to oznaczać, że ß będzie porównywać z SS w Niemczech lub podobnym - nie ma zastosowania do TimeSpan –

Odpowiedz

12

Zarówno wewnętrznie robi to samo. Porównaj Ticks i zwróć wynik.

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

Jedynym powodem może być drugi przeciążenie dla CompareTo, który odbiera object typu kontrole parametrów dla null a następnie porównać. Wdrożone jak: kod

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

źródła od: Reference Source .NET Framework 4.5.1 - Microsoft

+1

To jest link, którego szukałem dla własnej odpowiedzi! +1 – BlackBear

Powiązane problemy