¿Por qué Resharper prefiere "como" a "es"?

13

Cuando escribo código como este, donde obj es una variable local:

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

Resharper ofrece cambiarlo a un código como este:

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

Prefiero el primero, ya que no ofrece la oportunidad de excepciones de referencias nulas accidentales. ¿Qué razones hay para preferir la otra forma?

¿Por qué Resharper recomienda esto?

Dave Hillier
fuente

Respuestas:

25

En primer lugar, mire la respuesta de Jon Skeet para una pregunta general sobre el casting en C #:

No hagas esto:

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

Esto no solo está comprobando dos veces, sino que puede estar comprobando cosas diferentes, si randomObject es un campo en lugar de una variable local. Es posible que el "if" pase pero luego el elenco falle, si otro hilo cambia el valor de randomObject entre los dos.

(...)

Si randomObject podría ser una instancia de TargetType y TargetType es un tipo de referencia, utilice un código como este:

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

Luego vea temas similares:

yee
fuente
1
+1 Ver también la publicación del blog de Eric Lippert sobre el tema.
Brian