2010-10-14 4 views
2

qui est plus efficace/meilleur code. utiliser est objet et puis unbox si c'est ce type d'objet ?? ou utiliser des captures d'essayerqui est plus efficace? using est objet et ou essayer d'attraper

WizardStep parentWizardStep;  
try 
{ 
    parentWizardStep = (WizardStep)this.Parent; 
} 
catch 
{ 
    throw new Exception("Unable to cast parent control to this type."); 
} 

OU CE:

WizardStep parentWizardStep;   
if(this.Parent is WizardStep) 
{ 
    parentWizardStep= (WizardStep)this.Parent; 
} 
else 
{ 
    throw new Exception("Unable to cast parent control to this type."); 
} 

Répondre

17

Si vous avez besoin de lancer une exception lorsque le sort est invalide, pourquoi êtes-vous prendre la peine d'attraper le InvalidCastException normal? Il suffit de le jeter sans code supplémentaire:

WizardStep parentWizardStep = (WizardStep) Parent; 

Vous remplacez actuellement une exception qui transmet son sens dans son type (InvalidCastException - au moins, de sorte que vous espérez) avec nu Exception - pourquoi ne voulez-vous perdre des informations ?

Ce qui précède est certainement ce que je fais toujours si c'est un bug pour la valeur pertinente à pas être du type correct. Dans le cas contraire, utilisez l'opérateur as et un chèque nul:

WizardStep parentWizardStep = Parent as WizardStep; 
if (parentWizardStep == null) 
{ 
    // It wasn't a WizardStep. Handle appropriately 
} 
else 
{ 
    // Use the WizardStep however you want 
} 

Mais de toute façon, il est horrible de faire quelque chose que vous connaissez pourrait jeter une exception, et où il est facile de tester pour éviter l'exception, mais le choix pour l'attraper à la place. L'efficacité sera faible, mais plus important encore, c'est juste une utilisation inappropriée des exceptions. Mis à part toute autre chose, vous attrapez actuellement tous les exceptions ... que se passe-t-il si l'extraction this.Parent lance un type d'exception complètement différent? Cela n'a peut-être rien à voir avec le casting. Acceptez uniquement les exceptions spécifiques sauf si vous essayez d'implémenter un gestionnaire "attrape-tout" de niveau supérieur (par exemple, pour abandonner les requêtes du serveur).

+0

Très bon point. Je supposais qu'il y avait probablement plus à faire que de re-lever une exception IllegalCastException, mais sinon, c'est la meilleure option ... –

+0

D'accord. Si vous avez réellement besoin de piéger l'exception et de faire autre chose que de relancer, utilisez le bloc try/catch. Sinon, faites comme @Jon dit. –

+0

Un petit problème. Il y a des moments (bien que ce ne soit probablement pas l'un d'entre eux) où vous voulez attraper une exception spécifique et ensuite l'encapsuler http://msdn.microsoft.com/en-us/library/ms229049.aspx –

5

Il est plus efficace d'utiliser comme à la place:

WizardStep parentWizardStep = this.Parent as WizardStep; 
if(parentWizardStep == null) 
{ 
    // This isn't the right type 
    throw new ApplicationException("Your exception here."); 
} 

// Use parentWizardStep here.... 
Questions connexes