2013-06-10 8 views
11

Cosa deve essere restituito in un metodo CompareTo quando l'oggetto specificato è null?Override CompareTo: cosa fare con null case?

MSDN Library mostra un esempio in cui viene restituito 1. Ma mi sarei aspettato di lanciare un errore perché il confronto con null non è possibile.

Mi aspetto diverse opinioni per questa risposta. Quale potrebbe essere un approccio di best practice?

+1

Cosa intendi, il confronto con null è "non possibile"? Tutti i tipi di riferimento possono essere paragonati a null normalmente. Altrimenti puoi avvolgere le cose con la [classe Nullable] (http://msdn.microsoft.com/en-us/library/system.nullable.aspx). – Renan

+0

Se "si aspettano opinioni diverse", questo non è adatto per lo stack overflow poiché le FAQ indicano chiaramente che è necessario "evitare di fare domande soggettive". –

+1

l'esempio è valido. Come CompareTo restituisce l'ordinamento degli oggetti, non è inaspettato categorizzare null come il primo elemento – NoviceProgrammer

risposta

22

Sì, c'è una buona pratica. Contrariamente a quanto stanno dicendo le altre risposte, c'è uno standard previsto, non solo un comportamento più popolare.

La risposta corretta è data nella documentazione MSDN per IComparable<T>.CompareTo e IComparable.CompareTo:

Per definizione, qualsiasi oggetto confronta superiore nullo, e due nullo riferimenti risultano uguali tra loro.

(contrattualmente, confrontando maggiore è definito come:. Se a > b poi a.CompareTo(b) > 0)

Questo comportamento visto è confermata anche per esempio in Nullable.Compare<T>. Null viene sempre confrontato con meno di un valore.

È anche interessante notare che per il non generico confronta, tipi di mismatching non devono essere trattati come nullo:

Il parametro, obj, devono essere dello stesso tipo come la classe o desunto che implementa questa interfaccia; in caso contrario, una ArgumentException è generata.


Questo non influisce la tua domanda, ma essere consapevoli, Nullable<T> comparison operators (==, !=, <, <=, >, >=) non seguono la convenzione IComparable.

Quando si esegue il confronto con i tipi nullable, se il valore di uno dei tipi nullable è nullo e l'altro non è, tutti i confronti restituiscono false eccezione != (non uguale). È importante non per assumere che poiché un confronto particolare restituisce false, il caso opposto restituisce true. Nell'esempio seguente, 10 non è maggiore di, minore di, né uguale a null. Solo num1 != num2 restituisce true.

V'è anche il risultato strano che (int?)null == (int?)null viene valutato come vero, ma non lo fa (int?)null <= (int?)null.

2

La scelta è vostra. Non è al di là del regno della possibilità di immaginare un caso d'uso valido in cui mettere a confronto qualcosa con niente e voglio che "qualcosa" sia visto come più grande. Ma è per questo che lo stai scavalcando, così puoi decidere come gestirlo.

1

La migliore pratica dipenderà dal caso particolare: il confronto con null potrebbe essere possibile a seconda dell'oggetto che si sta confrontando.

Se definisco il mio oggetto in modo che null sia il valore più basso possibile per qualsiasi confronto, il confronto con null è chiaramente possibile e ha un risultato ben definito. In altri casi, lanciare un'eccezione potrebbe avere più senso.

In definitiva, questa è una domanda di progettazione (abbastanza soggettiva), a cui non è necessariamente una risposta.

-1

CompareTo con argomento null influisce sul caso quando si ordina un elenco con elementi null. Restituendo 1 quando l'oggetto dato è nullo, appare nullo in cima alla lista quando è ordinato, che è il comportamento più popolare.