2014-04-15 22 views
13

Ho esaminato alcuni esempi di codice Microsoft per il sensore Kinect e sono incappato nella riga seguente.Perché utilizzare TimeSpan.CompareTo() anziché < > o =

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

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

Capisco come CompareTo() è utile in scenari come l'ordinamento, ma perché dovrebbe essere utilizzato in un condizionale if() invece di un approccio più diretto?

if (timeRemaining > this.zeroDuration) 
{ 
} 

PS: vorrei prendere con un grano di sale se fosse da qualsiasi altra fonte, ma data la qualità generale del codice di assumere un motivo ci sarà

+0

Mi piacerebbe pensare che è solo una differenza stilistica, ma potrei sbagliarmi. @Amicable che riguarda principalmente diversi confronti di uguaglianza, non '>' vs 'CompareTo'. –

+0

Per TimeSpan, non c'è differenza. La mia ipotesi è che lo sviluppatore di campioni non fosse a conoscenza dell'esistenza di operatori sovraccaricati. –

+1

@Impossibile null prima di una stringa e utilizza CultureInfo.CurrentCulture.CompareInfo.Compare, che significa che utilizzerà un confronto dipendente dalla cultura. Ciò potrebbe significare che ß sarà paragonabile a SS in Germania, o simile - non è applicabile a TimeSpan –

risposta

12

Sia internamente fa la stessa cosa. Confronta Ticks e restituisci il risultato.

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

L'unico motivo potrebbe essere l'altro sovraccarico per CompareTo, che riceve un object tipo controllo dei parametri per null e quindi confrontare. Implementato come: codice

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

Fonte da: Reference Source .NET Framework 4.5.1 - Microsoft

+1

Questo è il link che stavo cercando per la mia risposta! +1 – BlackBear

Problemi correlati