2014-04-15 12 views
13
verwenden?

Ich habe einige Microsoft-Codebeispiele für den Kinect-Sensor gelesen und bin über die folgende Zeile gestolpert.Warum TimeSpan.CompareTo() anstelle von < > oder =

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

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

Ich verstehe, wie CompareTo() in Szenarien wie das Sortieren nützlich ist, aber warum sollte es in einem bedingten if() anstelle des direkteren Ansatz verwendet werden?

if (timeRemaining > this.zeroDuration) 
{ 
} 

PS: Ich würde es mit einem Körnchen Salz nehmen, wenn es aus einer anderen Quelle ist aber die allgemeine Qualität des Codes gegeben annehmen, dass es ein Grund,

+0

würde ich nehme an, es ist nur ein stilistischer Unterschied, aber ich könnte falsch sein. @Amicable das geht hauptsächlich um verschiedene Gleichheitsvergleiche, nicht '>' vs 'CompareTo'. –

+0

Für TimeSpans gibt es keinen Unterschied. Meine Vermutung ist, dass der Sample-Entwickler nicht wusste, dass überladene Operatoren existierten. –

+1

@Amicable null kommt vor einer Zeichenfolge und es verwendet CultureInfo.CurrentCulture.CompareInfo.Compare, was bedeutet, dass es einen kulturabhängigen Vergleich verwendet. Dies könnte bedeuten, dass ß in Deutschland mit SS gleichgestellt wird oder ähnliches - gilt nicht für TimeSpan –

Antwort

12

ist sowohl intern tut das Gleiche. Vergleichen Sie Ticks und geben Sie das Ergebnis zurück.

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

Der einzige Grund könnte die andere Überlastung für CompareTo sein, die einen object Typ-Parameter überprüfen null empfängt und dann vergleichen. Umgesetzt wie:

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

Quellcode aus: Reference Source .NET Framework 4.5.1 - Microsoft

+1

Das ist der Link, den ich für meine eigene Antwort gesucht habe! +1 – BlackBear

Verwandte Themen