2010-03-26 4 views
0

Souvent, je me surprends à venir à travers le code comme ceci:Refactor déclaration d'instance du bloc d'essai au bloc d'essai ci-dessus dans une méthode

try 
{ 
    StreamWriter strw = new StreamWriter(); 
} 

Cependant, il n'y a pas de référence à l'objet en dehors du champ d'application du bloc d'essai. Comment est-ce que je pourrais refactoriser (extraire au champ dans Visual Studio indique qu'il n'y a aucun champ ou quelque chose) l'instruction dans le bloc d'essai afin qu'il soit déclaré au-dessus du bloc d'essai ainsi je peux l'employer n'importe où dans la méthode?

Merci

+0

Vous pouvez recourir à la plaine ancienne Ctrl + C et Ctrl + V ;-) –

Répondre

1

Il vous suffit de diviser la déclaration et l'affectation. Si vous avez ReSharper, il y a une méthode pour faire la scission, mais vous devrez le déplacer manuellement:

StreamWriter strw = null; 
try 
{ 
    strw = new StreamWriter(); 
} 
catch() 
{ // ... 

Souvent, en ajoutant le (techniquement inutile) = null; est nécessaire, ainsi, pour éviter les avertissements potentiels sur utiliser des variables avant l'affectation, en raison de l'affectation dans une portée différente. Cela dépend cependant un peu de la manière dont vous utilisez les données.

De plus, étant donné que StreamWriter est IDisposable, vous devez vous assurer que vous disposez d'un bloc finally qui effectue la mise au rebut ou placer l'intégralité de l'utilisation dans un bloc using.

+0

Cela ne compilera pas. "strw" est déclaré deux fois. Supprimer "StreamWriter" de l'intérieur du try {} et ça devrait aller. – Peter

+0

@Peter: Désolé - erreur de copier/coller stupide. Fixé. –

+0

Bonjour. StreamWriter est juste un type d'exemple, je suis conscient du problème IDisposable. Merci :) Je n'ai pas Resharper pour le moment, en attendant la version finale de 5.0, donc je peux l'obtenir pour 2010. – dotnetdev

0
StreamWriter strw = null; 
try 
{ 
    strw = new StreamWriter(); 
} 

Mais pour un StreamWriter (qui est IDisposable), il est encore préférable d'utiliser le using -keyword:

using(StreamWriter strw = new StreamWriter()) 
{ 
    .. 
} 
Questions connexes