Eccezione C # NullReference e suggerimento ReSharper
Domanda
Questo è quello che ho scritto:
if ((lstProperty[i].PropertyIdentifier as string).CompareTo("Name") == 0)
Resharper mi ha messo un errore (sono nuovo con ReSharper ... lo sto provando) e mi suggerisce:
if (((string) lstProperty[i].PropertyIdentifier).CompareTo("Name") == 0)
Perché il secondo è NullException sicuro? Per me entrambi andranno in crash se appare un valore null?
Soluzione
L'operatore 'as' restituirà null se il cast non può essere eseguito, mentre un cast in stile C genererà un'eccezione se non può eseguire il cast.
Suggerisco di suddividerlo in più dichiarazioni:
string propertyIdentifier = lstProperty[u].PropertyIdentifier as string;
if(propertyIdentifier != null && propertyIdentifier.CompareTo("Name") == 0)
{
... your if statement ...
}
Resharper non dovrebbe lamentarsi di questo, e anche tu non otterrai una NullReferenceException se PropertyIdentifier è nullo o non una stringa.
Altri suggerimenti
Entrambi gli esempi avranno esito positivo o negativo nelle stesse circostanze e quando avranno esito positivo, il comportamento sarà identico.
Quando falliscono, il risultato sarà leggermente diverso: il secondo esempio fallisce leggermente prima (al cast) e con un'eccezione più specifica ( InvalidCastException
vs. NullReferenceException
).
Il vantaggio principale è il debug: quando falliscono, hai maggiori informazioni sul perché non è riuscito nel secondo esempio che nel primo. In particolare, se PropertyIdentifier è null
vs. non- string
, puoi dirlo nel secondo caso, ma non nel primo caso.
Inoltre, se ci si trova in un try / catch
, è possibile gestire il caso non stringa
in un percorso di codice separato rispetto a null
caso. Tuttavia, probabilmente non dovresti codificare in questo modo: se lo fai, stai facendo qualcos'altro di sbagliato.
Potrebbe aiutare a chiarire la situazione se si passa attraverso il seguente codice nei vari casi:
var propertyI = lstProperty[i];
var propertyIdentifier = propertyI.PropertyIdentifier;
// pick one of these:
var propertyIdentifierAsString = propertyIdentifier as string;
var propertyIdentifierAsString = (string)propertyIdentifier;
if (propertyIdentifierAsString.CompareTo("Name") == 0)