2011-12-27 13 views
9

Sto implementando IComparable e IComprable<T> in una delle mie classi. C'è qualche raccomandazione su come il metodo CompareTo in ogni caso dovrebbe comportarsi quando viene dato un argomento nullo? Dovrebbe restituire un numero positivo o lanciare un ArgumentNullException? Oppure questo comportamento può variare a seconda della classe di implementazione?Comportamento IComparable per argomenti nulli

Ho visto la documentazione MSDN (here e here) ma non ha nulla da dire su questo argomento. Qualsiasi aiuto sarà apprezzato.

risposta

9

Entrambi i riferimenti MSDN per IComparable.CompareTo() e IComparable<T>.CompareTo() stato il seguente:

Per definizione, qualsiasi oggetto confronta superiore (o segue) Nothing, e due riferimenti nulli risultano uguali tra loro.

Nothing in VB corrisponde a null in C#.

Nota che i precedenti comma precisa:

Il significato dei confronti, "meno di", "uguale" e "maggiore di", dipende dalla particolare implementazione.

Ma i riferimenti di istanza che non sono nulli sono sempre maggiori dei riferimenti nulli, indipendentemente dal modo in cui si confrontano le istanze della classe.

12

ho visto la documentazione MSDN ma non ha nulla da dire su questo argomento

Sì lo fa, ma non in modo molto chiaro. La documentazione afferma:

Per definizione, qualsiasi oggetto confronta maggiore di (o segue) Nulla e due riferimenti nulli si confrontano l'uno con l'altro.

La documentazione è confusa perché mescola gli idiomi da C# (null) e VB (Nothing) nella stessa frase. Lo dirò al responsabile della documentazione.

Si noti che la stessa regola si applica ai tipi di valori nullable. Se si ordina un elenco di numeri annullabili, ad esempio, 1 viene considerato maggiore di null ai fini dell'ordinamento. Stai attento; questo non è il modo in cui gli interi nulli sono comparabili per impostazione predefinita in C#.

+0

Si noti che se si fa clic sulla scheda C# in Sintassi nella pagina http://msdn.microsoft.com/en-us/library/system.icomparable.compareto.aspx, il testo diventa "... confronta maggiore di (o segue) null e due riferimenti null ... " – phoog

+0

@phoog: Nice! Non l'avevo notato. –

5

Assicurarsi di utilizzare Object.ReferenceEquals per verificare se un argomento passato a CompareTo è nullo. Evita di utilizzare gli operatori == e! = Nei metodi CompareTo perché qualcuno potrebbe effettivamente seguire il suggerimento MSDN per delegare tali operatori al metodo CompareTo, che a sua volta creerebbe un ciclo infinito e uno stack overflow (!) In un batter d'occhio.

Ecco un modello di come si potrebbe cercare di implementare il metodo CompareTo:

public class Piano : IComparable<Piano> 
{ 

    public float Mark { get; set; } 

    public int CompareTo(Piano other) 
    { 
     // The very basic implementation of CompareTo 

     if (object.ReferenceEquals(other, null)) 
      return 1; // All instances are greater than null 

     return Mark.CompareTo(other.Mark); 

    } 

} 

Il codice sorgente intera con spiegazioni su this indirizzo.