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?

È stato utile?

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top