Perché Resharper preferisce "as" a "is"?


13

Quando scrivo codice in questo modo, dove obj è una variabile locale:

if (obj is IMyInterface)
{
   var result = (IMyInterface)obj;
   // ....
}

Resharper si offre di cambiarlo in codice in questo modo:

var result = obj as IMyInterface;
if (result != null)
{
   // ...
}

Preferisco il primo, poiché non offre alcuna possibilità per eccezioni accidentali di riferimento null. Quali sono i motivi per preferire l'altra forma?

Perché Resharper lo consiglia?

Risposte:


25

Innanzitutto guarda la risposta di Jon Skeet per una domanda generale sul casting in C #:

Non farlo:

if (randomObject is TargetType)
{
    TargetType foo = (TargetType) randomObject;
    // Do something with foo
}

Non solo sta verificando due volte, ma potrebbe anche controllare cose diverse, se randomObject è un campo anziché una variabile locale. È possibile che l '"if" passi ma poi il cast fallisce, se un altro thread cambia il valore di randomObject tra i due.

(...)

Se randomObject potrebbe essere un'istanza di TargetType e TargetType è un tipo di riferimento, utilizzare il codice in questo modo:

TargetType convertedRandomObject = randomObject as TargetType;
if (convertedRandomObject != null)
{
    // Do stuff with convertedRandomObject
}

Quindi vedi argomenti simili:


1
+1 Vedi anche il post sul blog di Eric Lippert sull'argomento.
Brian
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.