12
votes

C # Streamdreader dans un essai / enfin

J'ai une question aujourd'hui impliquant la classe StreamReader. Initialisation spécifiquement de cette classe à l'aide du paramètre Nom de fichier par exemple:

     TextReader tr;  
        try
        {
            var serializer = new XmlSerializer(type);
            tr = new StreamReader(fileName);
            var obj = serializer.Deserialize(tr);
        }
        finally
        {
            tr.Close();    
        }


1 commentaires

Déclarant textreader tr; Donc, il est disponible pour le moment n'est pas un problème. Mais en utilisant est une meilleure réponse.


5 Réponses :


2
votes

N'utilisez pas d'essayer / enfin ici, utilisez l'utilisation de l'instruction, qui fait la même chose que ce que vous faites avec la syntaxe plus propre. La réponse est "oui", BTW :)


0 commentaires

26
votes

Le moyen le plus simple consiste à utiliser un à l'aide de instruction: xxx

Le compilateur générera un blocage de try-enfin pour vous et mettra le code pour appeler fermer (réellement DISPOSER) Enfin.

Si vous devez épeler le enfin explicitement, votre deuxième exemple fonctionnera, sauf que vous devez forcer tr à être initialisé: xxx

et vous voulez bien sûr vérifier tr! = null à l'intérieur de votre enfin, au cas où une exception a été produite avant tr = nouveau streamreader (...) a été exécuté.


3 commentaires

Dernit. Battez-moi au post :)


Donc, cela signifie que la méthode de près n'a pas besoin d'être appelée manuellement?


JL: correct. Utiliser S'assurera que la méthode de Dispection est appelée pour vous, et pour la fermeture de Textreader Fermer et disposera de la même chose (le nom de fermeture est conservé pour des raisons historiques). Vous pouvez appeler fermer manuellement à l'aide du bloc à l'aide du bloc si vous souhaitez fermer le lecteur tôt pour une raison quelconque, mais le compilateur générera le jet d'appel dans les scènes dans le cadre de son expansion du mot clé . Donc, non, ferme pas doit être appelée manuellement si vous utilisez en utilisant .



2
votes

Vous devez utiliser le mot-clé code> à l'aide de code>.

using (TextReader tr = new StreamReader(fileName))
{
    var obj = serializer.Deserialize(tr);
}


0 commentaires

8
votes

Oui, soit:

var serializer = new XmlSerializer(type);
using (TextReader tr = new StreamReader(fileName))
{
    var obj = serializer.Deserialize(tr);
}


0 commentaires

3
votes

Un commentaire sur ce code

TextReader tr;  
        try
        {
            var serializer = new XmlSerializer(type);
            tr = new StreamReader(fileName);
            var obj = serializer.Deserialize(tr);
        }
        finally
        {
            //tr.Close(); 
            // Correct way
            if (tr != null) tr.Close();
        }


0 commentaires