Using et dim differance entre deux methodes [Résolu]

Signaler
Messages postés
218
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
17 mars 2012
-
Messages postés
107
Date d'inscription
samedi 25 novembre 2000
Statut
Membre
Dernière intervention
4 mai 2013
-
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

Messages postés
14757
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
14 janvier 2021
151
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
Messages postés
107
Date d'inscription
samedi 25 novembre 2000
Statut
Membre
Dernière intervention
4 mai 2013

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 !
Messages postés
218
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
17 mars 2012

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.