Avec ... Fin avec vs Utilisation dans VB.NET
Je viens de constater que comme C#, VB.NET a aussi le using
mot-clé.
Jusqu'à maintenant, je pensais qu'il n'existait pas (je suis bête, je sais...) et y a des trucs comme ça à la place:
With New OleDbConnection(MyConnectionString)
' Do stuff
End With
Quelles sont les implications de cette comparé à le faire avec un using
déclaration de ce type
Using cn as New OleDBConnection(MyConnectionString)
With cn
' Do stuff with cn
End With
End using
Mise à JOUR:
Je dois ajouter que je suis familier avec ce que les using
déclaration n'est en ce qu'il dispose de l'objet lorsque la construction est sorti.
Cependant, autant que je comprends le With New ...
construire aura pour objet de marquer l'objet en tant que prêt pour la collecte des ordures quand elle est hors de portée.
Donc ma question est vraiment, c'est la seule différence le fait que, avec using
je vais libérer la mémoire tout de suite, alors qu'avec le With
construire, il sera libéré à chaque fois que le GC se sent comme ça? Ou ai-je raté quelque chose de grand ici?
Sont-il mieux les répercussions de la pratique? Devrais-je aller et de réécrire tout le code que j'ai utilisé With New MyDisposableObject() ... End With
comme Using o as New MyDisposableObject()
?
source d'informationauteur yu_ominae
Vous devez vous connecter pour publier un commentaire.
Ressources gérées sont éliminés par le garbage collector sans codage supplémentaire de votre part.
Vous n'avez pas besoin à l'Aide de ou Avec consolidés.
Parfois, votre code exige des ressources non managées. Vous êtes responsable de leur élimination. Un à l'Aide de bloc garantit que les Disposer méthode sur l'objet est appelé lorsque votre code est fini avec eux.
With
Consolidés/BlocsC'est à la fois vrai et pas vrai. Il est vrai, dans le sens que tous objets sont "marqués" (les puristes pourrait ergoter avec cette terminologie, mais les détails ne sont pas pertinentes) en tant que prêt pour la collecte des ordures quand ils passent hors de portée. Mais alors, dans ce sens, il n'est également pas tout à fait vrai, car il n'y a rien de spécial à propos de la
With
mot-clé à l'égard de ce comportement. Lorsqu'un objet est mis hors de portée, il est admissible pour la collecte des ordures. Période. C'est vrai pour la méthode de niveau portée et c'est vrai pour le domaine de niveau bloc (par exemple,With
For
Using
etc.).Mais ce n'est pas pourquoi vous utilisez
With
. La raison en est qu'il vous permet de définir plusieurs propriétés dans l'ordre sur un profondément imbriquée objet. En d'autres termes, supposons que vous avez un objet sur lequel vous souhaitez définir un tas de propriétés, ainsi que l'accès de cette façon:MyClass.MemberClass.AnotherMemberClass.Items(0)
. Voir tous ces points? Il peut (théoriquement) deviennent inefficaces à écrire du code qui doit travailler par le biais de cette série de points dessus et à l'accès à l'exact même objet à chaque fois que vous définissez une propriété sur elle. Si vous savez quelque chose sur C ou C++ (ou toute autre langue qui a des pointeurs), vous pouvez penser de chacun de ces points comme impliquant un déréférencement de pointeur. LeWith
principe passe par tous de cette indirection qu'une seule fois, le stockage de l'objet dans une variable temporaireet vous permettant de définir des propriétés directement sur l'objet stocké dans la variable temporaire.Peut-être un peu de code permettrait de rendre les choses plus claires. Chaque fois que vous voyez un point, pense peut être lente!
Supposons que vous démarrez avec le code suivant, la récupération de l'objet 1 de profondément imbriquée
Items
la collecte et l'établissement de plusieurs propriétés. Voir combien de fois avons-nous pour récupérer l'objet, même si c'est exactement le même objet à chaque fois?Maintenant nous allons modifier ce code pour utiliser un
With
bloc:L'effet ici, cependant, est identique au code suivant:
Accordée, de ne pas introduire un nouveau champ d'application, de sorte
tempObj
de ne pas aller hors de portée (et donc d'être éligible pour la collecte des ordures) jusqu'à ce que le niveau supérieur de la portée se termine, mais c'est rarement une préoccupation de premier plan. Le gain de performance (le cas échéant) s'attache à la fois de ces deux derniers fragments de code.La réel victoire de l'aide
With
blocs d'aujourd'hui n'est pas la performance, mais la lisibilité. Pour plus d'idées sur laWith
permettant d'améliorer les performances, stylistique des suggestions, et ainsi de suite, voir les réponses à cette question.With New
?L'ajout de la
New
mot clé à unWith
déclaration a exactement le même effet que celui que nous venons de voir (la création d'un local variable temporaire pour contenir l'objet), sauf qu'il est presque inutile. Si vous avez besoin de créer un objet avecNew
vous pouvez déclarer une variable pour contenir. Vous allez probablement avoir besoin de ne quelque chose avec cet objet, plus tard, à l'instar de passer à une autre méthode, et vous ne pouvez pas le faire dans unWith
bloc.Il semble que le seul but de
With New
est qu'il permet d'éviter une déclaration explicite des variables, plutôt causant le compilateur fasse implicitement. Appelez-moi fou, mais je ne vois pas l'avantage dans ce.En fait, je peux dire que j'ai honnêtement jamais vu aucun code qui utilise cette syntaxe. La seule chose que je peux trouver sur Google est des bêtises comme ça (et
Call
est une bien meilleure alternative là de toute façon).Using
Consolidés/BlocsContrairement à
With
Using
est incroyablement utile et devrait apparaître fréquemment dans typique VB.NET code. Cependant, il est très limité dans son application: il fonctionne seulement avec des objets dont le type implémente laIDisposable
interface de modèle. Vous pouvez dire ce par la vérification pour voir si l'objet a unDispose
méthode que vous êtes censé appeler chaque fois que vous avez fini avec elle, afin de libérer toutes les ressources non managées.Qui est, par ailleurs, une règle, vous devez toujours suivre lorsqu'un objet a un
Dispose
méthode: vous devez toujours l'appeler à chaque fois que vous avez fini d'utiliser l'objet. Si vous ne le faites pas, ce n'est pas nécessairement la fin du monde—le garbage collector peut sauver votre bacon—mais c'est une partie du marché documenté et toujours de bonne pratique de votre part à l'appelDispose
pour chaque objet qui le fournit.Si vous essayez d'envelopper la création d'un objet qui n'est pas mettre en œuvre
IDisposable
dans unUsing
bloc, le compilateur va aboyer à vous et générer une erreur. Il ne fait pas de sens pour tous les autres types, puisque sa fonction est essentiellement équivalent à unTry
/Finally
bloc:Mais c'est laid et devient plutôt difficile lorsque vous commencez à la nidification (comme si nous avions créé un
Pen
objet qui doivent être éliminés en tant que bien). Au lieu de cela, nous utilisonsUsing
qui a le même effet:La
Using
déclaration de travaux à la fois avec des objets que vous êtes l'acquisition (à l'aide de laNew
mot-clé ou en appelant une méthode commeCreateGraphics
), et avec des objets que vous avez déjà créé. Dans les deux cas, il s'assure que laDispose
méthode est appelée, même si une exception est lancée quelque part à l'intérieur du bloc, ce qui garantit que l'objet de ressources non managées obtenir correctement éliminés.Il me fait peur un peu que vous avez écrit le code dans VB.NET sans savoir à propos de la
Using
déclaration. Vous ne l'utilisez pas pour la création de tous les objets, mais il est très important lorsque vous avez affaire à des objets qui implémententIDisposable
. Vous devriez revenir en arrière et re-vérifier votre code pour vous assurer que vous êtes en utilisant, le cas échéant!La différence est la
Using With...End End
Appels
cn.Dispose()
automatiquement lorsque vous sortez de la portée (End Using
). Mais dans leWith New...End
.Dispose() n'est pas explicitement demandé.
Aussi avec le nom de l'objet, vous pouvez créer des montres et
?cn
dans la fenêtre exécution. Avec le sans nom d'objet, vous ne pouvez pas.À l'aide de connexion... la Fin de l'Aide : soyez prudent !!!
Cette déclaration va fermer votre base de données connexion !
Au milieu d'un module ou d'un formulaire(s), j'.e.l'ajout ou la mise à jour des enregistrements, cela permet de fermer la connexion. Lorsque vous essayez de faire une autre opération dans ce module, vous recevrez une erreur de base de données. Pour les connexions, je ne l'utilise plus. Vous pouvez utiliser l'Essayer... Fin Essayer wihthouth l'instruction à l'Aide.
J'ouvre la connexion à l'entrée dans le module et de le fermer il lors de la sortie. Cela résout le problème.