6
votes

Où mettre essayer / attraper quand vous utilisez Idisposable

J'ai été conseillé de mettre tout un en utilisant le bloc à l'intérieur d'un essayer , sinon le à l'aide de d'étendue empêchera l'exception d'être pris. Cependant, cela n'empêcherait-il pas le en utilisant de disposer correctement ses ressources si une exception a été lancée? Si j'ai le code ci-dessous, où dois-je mettre le essayer blocks? xxx

Dans cette application, il est beaucoup plus important d'assurer les connexions à la base de données Commencez à accumuler en raison d'exceptions.


0 commentaires

3 Réponses :


1
votes

Il n'est pas nécessaire de mettre essayer attrape car en utilisant implicitement, il utilise en fait essayer enfin et sûr qu'il dispose des objets .

Ceci est MSDN à l'aide d'un échantillon à propos d'essayer de prendre et d'utiliser: xxx

est égal à: xxx


5 commentaires

Nitpick - en utilisant implémente essayer / enfin, pas essayer / attraper


Faux, il ne mettra pas à mettre en œuvre des captures. Mais seulement essayer et enfin!


@zenwalker J'ai écrit qu'il l'applique implicitement (je veux dire ce que l'OP veut d'essayer d'essayer) aussi j'ai dit que l'utilisation de le faire avec essayer enfin.


Quand j'ai commenté, le reste de vos lignes n'était pas là. Maintenant, vous l'avez corrigé!


@zenwalker Oui, je l'ai écrit d'abord après que je vois qu'il a une ambiguïté et le modifier.



9
votes

L'instruction code> à l'aide de code> empêchera déjà l'accumulation d'accumulation - il fait le côté nettoyage des choses pour vous, en étant efficacement un essayer code> / enfin code > Bloc avec un appel à Dispose code> dans le bloc enfin code>. Si vous aussi em> veux un essayer code> / attrape code> bloc, vous pouvez le mettre à l'intérieur ou à l'extérieur - mais êtes-vous sûr qu'il ne devrait pas être à un niveau supérieur? Comment vous attendez-vous réellement manipulez em> l'exception?

AS une mise à part, ce n'est pas clair pourquoi vous effacez les paramètres de la commande lorsque la commande est sur le point d'être disposée de toute façon ...

Je vous encourage-vous à déclarer les variables dans le en utilisant des déclarations code> également, de sorte que vous n'ayez pas fini de lire d'eux en dehors du bloc: P>

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    using (SqlCommand command = new SqlCommand(strPreparedStatement, connection))
    {
        if (sqlParameters != null)
        {
            // If sqlParameter is an array, you can just use
            // command.Parameters.AddRange(sqlParameters) instead
            foreach (SqlParameter parameter in sqlParameters)
            {
                command.Parameters.Add(parameter);
            }
        }
        using (SqlDataReader reader = command.ExecuteReader())
        {
            DataTable table = new DataTable();
            // Perform any extra initialization here
            table.Load(reader);
            return table;
        }
    }
}


1 commentaires

Intéressant. Tous les très bons points. J'apprécie le point sur sqldatreader . J'ai totalement manqué ça.



2
votes

Vous devez envelopper le lecteur de données dans une instruction à l'aide d'une instruction, car il s'agit d'une ressource jetable: xxx

J'ai également rendu la connexion, la commande et les objets de lecteur de données sont définis localement dans cette bloquer la portée.

en ce qui concerne un Essayez / enfin indiquez que vous n'en avez plus besoin que le à l'aide des instructions Assurez-vous que la méthode Dispose sera invoqué même en cas d'exception. Et cette méthode pour les connexions et les commandes SQL garantit de les libérer correctement.


1 commentaires

Bon point. J'avais manqué que jusqu'à ce que les réponses ici indiquaient cela. Je préfère également utiliser le combiné en utilisant des blocs . Je ne sais pas pourquoi je ne pensais pas que je pourrais l'utiliser ici.