2010-08-11 24 views
14

Ho la seguente riga di codice:Se null.Equals (nulli) Perché ricevo un NullReferenceException

var selectedDomainID = lkuDomainType.EditValue.Equals(null) 
    ? string.Empty 
    : lkuDomainType.EditValue; 

volte questo genera un NullReferenceException. Quello che non capisco è il perché. Non è tutto il punto del mio codice da verificare per null e in tal caso assegnare string.empty? Quando effettuo il check in DEBUG, dichiaro che EditValue == null quindi cosa mi manca?

+2

non può lkuDomkainType essere null stesso? Quando si chiama lkuDomainType.EditValue, viene generata l'eccezione NullReferenceException. –

+2

A causa del tuo titolo: 'a == b' non è lo stesso di a.Equals (b)'. –

+0

@Stefan: ottimo punto! Modificato per essere più accurato per i futuri utenti ... Grazie –

risposta

26

Utilizzare lkuDomainType.EditValue == null, in caso contrario si sta tentando di chiamare un metodo di istanza su un oggetto nullo. Ma l'opzione migliore potrebbe essere lkuDomainType.EditValue ?? String.Empty. Fai attenzione anche al fatto che lkuDomainType è nullo, a meno che non si tratti di una classe e non di un oggetto.

+1

Grazie, sembra piuttosto ovvio a ben vedere, sicuramente un momento da "duh". Grazie. –

+4

+2 (purtroppo non possibile) per la risposta corretta e la raccomandazione di usare '??'. –

+0

+1: L'operatore null coalescing (o '??') è stato una grande aggiunta a .NET e qualcosa che mi manca gravemente quando uso Java. – Powerlord

15

Quando si utilizza Object.Property e Object non è definito, si sta dereferenziando un puntatore nullo ed è per questo motivo che si ottiene l'eccezione. Invece, l'uso:

var selectedDomainID = lkuDomainType.EditValue == null ? string.Empty : lkuDomainType.EditValue; 
+5

Ho dovuto revocare questa risposta a) per la risposta corretta, b) per usare * dereferenziazione * nella frase eb) per il nome utente quasi appropriato –

+0

Ottima risposta, +1, ma SO dice che la risposta di @Yuriy è stata la prima . Grazie comunque. –

+1

@Refracted Sì lo era, per 4 secondi :) Mi piace il suo suggerimento di usare '??' – NullUserException

3

si sta cercando di chiamare il metodo Equals su un oggetto null - fare in questo modo, invece:

lkuDomainType.EditValue == null 
2

EditValue == null. Ciò significa che non vi è alcun oggetto lì. Non è possibile chiamare funzioni su oggetti nulli, anche se la funzione è .Equals().

In questo caso è meglio dire "(lkuDomainType.EditValue == null)".

5

Se EditValue è nullo, non è possibile chiamare Equals. In questo cas si dovrebbe fare:

var selectedDomainID = lkuDomainType.EditValue == null ? string.Empty : lkuDomainType.EditValue; 

Oppure si può semplificare facendo:

var selectedDomainID = lkuDomainType.EditValue ?? string.Empty; 
2

si dovrebbe usare String.IsNullOrEmpty qui. Come questo:

var selectedDomainID = String.IsNullOrEmpty(lkuDomainType.EditValue) ? string.Empty : lkuDomainType.EditValue; 

Equals è un metodo, si sta cercando di chiamare un metodo su un oggetto null che è un'eccezione.

+0

Non capisco, non è 'String.IsNullOrEmpty' anche un * metodo *? –

+0

È un metodo statico, non è un metodo dell'oggetto lkuDomainType.EditValue. – brendan

+0

Ah, grazie per averlo chiarito. –

2

quando EditValue è nullo, non è possibile chiamare il metodo Equals su di esso quindi il modo migliore per controllare è quello di utilizzare

lkuDomainType.EditValue == null ? string.Empty : lkuDomainType.EditValue; 
3

Il problema è che si sta utilizzando l'oggetto prima di verificare se si tratta di nulla. Stai chiamando il metodo Equals dell'oggetto, che fallisce se il riferimento è nullo.

È necessario sostituire lo lkuDomainType.EditValue.Equals(null) per lkuDomainType.EditValue == null.

0

Se lkuDomainType.EditValue è null, quindi "lkuDomainType.EditValue.Equals (someObject)" equivale alla codifica "null.Equals (someObject)". Bene, ovviamente "null" non ha membri o metodi (non sarebbe nulla se lo facesse). Ecco perché ottieni una NullReferenceException.

La maggior parte degli esempi degli altri post funzionerà, incluso String.IsNullOrEmpty, che è un metodo che restituisce un valore booleano.

Problemi correlati