Using et dim differance entre deux methodes

Résolu
l0r3nz1 Messages postés 218 Date d'inscription mercredi 20 février 2008 Statut Membre Dernière intervention 17 mars 2012 - 7 déc. 2010 à 13:30
Sehnsucht Messages postés 107 Date d'inscription samedi 25 novembre 2000 Statut Membre Dernière intervention 4 mai 2013 - 7 déc. 2010 à 15:19
Bonjour,

vaut il mieux utiliser:
Using connection As New OleDbConnection(connectionACCESS(bdd))
...
End using

ou

Dim connection = New OleDbConnection(connectionACCESS(bdd))

quel est la differance? l'un est il mieux que l'autre?

merci pour vos réponses.

3 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
7 déc. 2010 à 13:46
Bonjour,

A la fin du Using, la méthode Dispose est utilisée, alors qu'à la fin de portée d'une variable DIM, le GC s'occupera d'elle.
Si tu veux utiliser la variable déclarée en Using ailleurs (retour de fonction par exemple) ça te sera impossible.

Mon site
3
Sehnsucht Messages postés 107 Date d'inscription samedi 25 novembre 2000 Statut Membre Dernière intervention 4 mai 2013
7 déc. 2010 à 15:19
Bonjour,

L'instruction Using (qui ne s'utilise qu'avec des objets qui implémentent IDisposable) assure que quelque soit le chemin d'exécution du code (levée d'exception par exemple), l'objet en question sera bien "disposé" (les ressources précédemment allouées seront bien libérées).

En fait Using est un sucre syntaxique pour une construction de ce type (avec ton code en exemple):
If True Then
    Dim connection As OleDbConnection
    Try
        connection = New OleDbConnection(connectionACCESS(bdd))
        ' code d'utilisation ...
    Finally
        If connection IsNot Nothing Then
            DirectCast(connection, IDisposable).Dispose()
        End If
    End Try
End If

(ou en C# pour expliquer en partie ce If True englobant:)
{
    OleDbConnection connection;
    try {
        connection = new OleDbConnection(connectionACCESS(bdd));
        // code d'utilisation ...
    } finally {
        if (connection != null)
            ((IDisposable)connection).Dispose();
    }
}


Donc pour résumer un Using c'est un bloc Try/Finally qui assure la libération des ressources dans tous les cas.
Pour l'histoire des accolades supplémentaires (C#) ou du If True (VB.Net, au passage si quelqu'un a mieux pour ça je suis preneur) cela sert à limiter la portée de la variable connection (sortie de l'accolade/du If elle "n'existe" plus)

Maintenant on peut très bien utiliser un Dim, mais il faut s'assurer qu'à un moment ou un autre (de manière systématique) on libère les ressources en utilisant "manuellement" la méthode Dispose, parce que sinon cela peut conduire à des fuites de mémoires.

Alors oui le GC va libérer l'objet ça aucun problème, par contre il ne libèrera pas les ressources non managées que cet objet à pu acquérir (par exemple un handle sur un fichier s'il s'agit d'un objet de type Stream)

Cordialement !
3
l0r3nz1 Messages postés 218 Date d'inscription mercredi 20 février 2008 Statut Membre Dernière intervention 17 mars 2012
7 déc. 2010 à 14:22
merci.

l'avantage du using c est donc une liberation plus rapide de la memoire, en cas de defaillance du ramasse miette, une execution plus sûre ( en cas de deconnexion temporaire a la bdd cette connexion doit etre refaite a chaque fonction). mais impossible de faire une classe bdd avec une connexion reutilisable partout.

cela parait evident maintenant.

merci encore.
0
Rejoignez-nous