Pourquoi Resharper préfère «comme» à «est»?

13

Lorsque j'écris du code comme celui-ci, où obj est une variable locale:

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

Resharper propose de le changer en code comme ceci:

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

Je préfère le premier, car il n'offre aucune possibilité d'exceptions de référence nulle accidentelles. Quelles sont les raisons de préférer l'autre forme?

Pourquoi Resharper le recommande-t-il?

Dave Hillier
la source

Réponses:

25

Regardez d'abord la réponse de Jon Skeet pour une question générale sur le casting en C #:

Ne faites pas ça:

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

Non seulement cette vérification est effectuée deux fois, mais elle peut également vérifier différentes choses, si randomObject est un champ plutôt qu'une variable locale. Il est possible que le «si» passe mais que la conversion échoue, si un autre thread change la valeur de randomObject entre les deux.

(...)

Si randomObject peut être une instance de TargetType et TargetType est un type de référence, utilisez un code comme celui-ci:

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

Consultez ensuite des sujets similaires:

yBee
la source
1
+1 Voir aussi le billet de blog d'Eric Lippert sur le sujet.
Brian