2016-09-23 2 views
2

Je suis en train d'examiner du code C# et cela fait un moment que j'ai travaillé avec C#, donc je voulais être sûr que mes instincts sont corrects. Dans ce code, je vois un certain nombre d'endroits dans un utilisant le bloc où quelque chose comme ce qui suit est fait:C# en utilisant clear dispose

using(StreamWriter thing = new StreamWriter()) { 

    DataSet DS = SQLQueryMethod(); 
    do stuff to DS and log that stuff to the a log file using thingy... 

    DS.clear(); 
    DS.Dispose(); 
} 

Maintenant, je l'ai fait un peu de recherche sur ce ainsi que regardé en arrière plusieurs années par mon défaut mémoire et je pense qu'il y a un certain nombre de façons de faire cela qui serait mieux. Je voudrais savoir quelle est la manière la plus «standard»/«meilleure pactice». Je pense que le numéro 1 ci-dessous est la meilleure façon de le faire.

merci d'avance.

  1. Ajouter à la DataSet l'instruction à l'aide afin qu'il soit éliminé automatiquement avec la fin de la portée de la déclaration en utilisant, éliminant ainsi la nécessité pour les deux claires et éliminer. Je ferais ceci:

    using(StreamWriter thing = new StreamWriter(), DataSet DS = new DataSet()) { 
    
        DS = SQLQueryMethod() 
        do stuff to DS{...} 
    
    } 
    
  2. Il suffit d'appeler le Éliminez sur DataSet DS depuis que je pense l'effacer juste avant un Éliminez ne sert à rien.

  3. Il est effectivement nécessaire de le faire de la manière originale.

+0

Cette question appartient probablement à http://codereview.stackexchange.com mais pour répondre à votre question, oui, oui, oui, mais je pense toujours que vous avez besoin 2 séparer les utilisations –

+0

Dès que je vois '.Dispose()' dans une méthode instanciant ce même objet, je recule toujours et je vois comment réécrire cela dans le modèle 'using' qui est flagrant presque tout le temps. –

+0

Je vois plusieurs réponses avec plusieurs instructions d'utilisation au lieu d'ajouter plusieurs éléments à une seule instruction using, y a-t-il une différence entre elles? Exemple: en utilisant (elementA, elementB) { } vs en utilisant (elementA) en utilisant (elementB) { } –

Répondre

6

multiples "instruction à l'aide" peut être utilisé comme suit:

using (StreamWriter thing = new StreamWriter()) 
using (DataSet DS = new DataSet()) 
{ 
    DS = SQLQueryMethod(); 
    //do stuff .... 
} 

Parce que StreamWriter et DataSet met en oeuvre la méthode Dispose() nécessaire dans l'interface IDisposable, pas besoin d'appeler explicitement après

+4

Vous pouvez même faire 'using (DataSet DS = SQLQueryMethod())' si vous voulez enregistrer une ligne –

+2

Pourquoi tout le monde déclare-t-il un 'nouveau DataSet()' dans les réponses? L'instruction 'using' ne conserve-t-elle pas la référence d'origine? – flakes

+2

@flkes - Je ne comprends pas non plus - cela ne compilera pas :) –

0

Le bon moyen est de disposer tout ce qui implémente IDisposable - comme

using (var thing = new StreamWriter()) 
using (var ds = SQLQueryMethod()) 
{ 
    do stuff to DS {} 
} 

Autres réponses suggérées sont erronées

using(StreamWriter thing = new StreamWriter()) 
using(DataSet DS = new DataSet()) 
{ 
    // this won't compile - DS is in using so it is a read-only variable 
    DS = SQLQueryMethod() 
    do stuff to DS{...} 
} 

Référence: Why is a variable declared in a using statement treated as readonly?

+0

La question portait sur l'utilisation des utilisations et IDisposable. – alexqc