2010-03-03 4 views
2

je reçois l'erreur suivante lors de l'exécution FXCop:FXCop casting Attention

CA1800: Microsoft.Performance: 'obj', une variable, est casté en type plusieurs fois 'travail' dans la méthode « ProduitsController .Détails (int, int) '. Mettre en cache le résultat de la 'comme' opérateur ou coulée directe pour éliminer le castclass redondant instruction

code:

 object obj = repository.GetJobOrPlace(jobId);//Returns (object) place or (object) product 

     if (obj != null) 
     { 
      if (obj is Job) 
      { 
       Job j = (Job) obj; 
       Debug.WriteLine(j.Title); 
      } 
      else if (obj is Place) 
      { 
       Place p = (Place) obj; 
       Debug.WriteLine(p.Title); 
      } 
     } 

Quel est le problème avec ça? Je ne peux voir qu'un seul casting: Job j = (Job) obj.

+1

L'opérateur "is" est également une distribution en ce qui concerne .NET. –

Répondre

6

Il n'y a qu'un cast mais il y a aussi un test. Vous pouvez donc remplacer le premier bloc par:

Job j = obj as Job; 
if (j != null) 
{ 
    Debug.WriteLine(j.Title); 
} 

Cela signifie que le test du temps d'exécution ne doit être effectué qu'une seule fois au lieu de deux fois. Il est un peu d'un micro-optimisation - et dans votre cas, il serait un peu le code messier, comme vous auriez besoin:

Job j = obj as Job; 
if (j != null) 
{ 
    Debug.WriteLine(j.Title); 
} 
else 
{ 
    Place p = obj as Place; 
    if (p != null) 
    { 
     Debug.WriteLine(p.Title); 
    } 
} 

(Ou déclarer et initialiser p plus tôt, ce qui gaspille un test si obj est en fait Job ...)

+0

Un détail mineur: la première ligne devrait être "Job j = obj en Job"; Avec majuscule J dans Job. –

+0

Nittpick mineur: "comme le travail" devrait être "comme Job" ;-) –

+0

Darn, Anders m'a battu à cela: P –