With... End With-vs Mit in VB.NET
Ich habe gerade herausgefunden, wie C#, VB.NET auch hat die using
Stichwort.
Bis jetzt dachte ich es gar nicht habe (dumm von mir, ich weiß...) und habe Sachen wie dies:
With New OleDbConnection(MyConnectionString)
' Do stuff
End With
Was sind die Auswirkungen dieser im Vergleich zu tut es mit einer using
Aussage wie diese
Using cn as New OleDBConnection(MyConnectionString)
With cn
' Do stuff with cn
End With
End using
UPDATE:
Sollte ich hinzufügen, dass ich vertraut bin mit dem, was die using
- Anweisung wird in, über das Objekt, wenn das Konstrukt zu verlassen.
Jedoch, soweit ich das verstanden habe die With New ...
erstellen, wird das Objekt markieren, das Objekt als bereit für die Müllabfuhr, wenn es den Bereich verlässt.
Also meine Frage wirklich ist, ist der einzige Unterschied die Tatsache, dass mit using
ich werde den Speicher freizugeben, sofort, in der Erwägung, dass mit der With
konstruieren, die es freigegeben wird, wenn der GC fühlt sich an wie es ist? Oder bin ich etwas fehlt, größer hier?
Gibt es best-practice-Auswirkungen? Soll ich gehen und schreiben Sie alle code mit ich verwendet With New MyDisposableObject() ... End With
als Using o as New MyDisposableObject()
?
Using
ist besser als With New ...
ist beim Umgang mit einer nicht verwalteten Objekts. Es sei denn, jemand kann mir ein gutes Beispiel, warum nicht verwenden With New ...
für eine lokale single-use-Objekt, ich sehe nicht ein, warum ich, sollten Sie nicht es verwenden, um meinen code aufgeräumt.InformationsquelleAutor yu_ominae | 2013-03-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwalteten Ressourcen Entsorgung durch den garbage-collector ohne zusätzliche Codierung auf deinem Teil.
Sie brauchen nicht Mit oder Mit Aussagen.
Manchmal erfordert code nicht verwaltete Ressourcen. Sie sind verantwortlich für deren Entsorgung. Ein Mit - block garantiert, dass die Entsorgen Methode auf dem Objekt aufgerufen wird, wenn dein code ist fertig mit Ihnen.
Using
rufen dieDispose()
Methode, die von nicht verwalteten Ressourcen? Ich dachte, alle Objekte, die Teil der .Net framework verwaltet wurden?Nicht verwaltete Ressourcen sind: ein Datei-handle, einen COM-wrapper, der eine Datenbank-Verbindung. Deklarieren Sie die Dispose-Methode realisiert, dass alle resource cleanup-Logik und compiler nennen Sie in der Verwendung - block.
Danke. Also, wenn ich dies richtig, eine DB-Verbindung nicht hatte
Dispose()
forderte er ausdrücklich nie sein wird Müll gesammelt?Es wird nie geschlossen
Eine verwaltete Ressource ist ein Objekt, das hat Sie gebeten, einige außerhalb Person, etwas zu tun, auf seinen Namen bis auf weiteres gebeten hat, den garbage collector für die Benachrichtigung, wenn es ist aufgegeben, und, wenn gegeben, eine solche Mitteilung wird wiederum sagen, die andere Person Ihre Dienste werden nicht länger benötigt. Eine nicht verwaltete Ressource ist eine Vereinbarung mit einer externen Einheit, etwas zu tun auf ein Objekt, in seinem Auftrag, bis auf weiteres, kombiniert mit einem Versprechen, durch das Objekt zu liefern, die eine solche Mitteilung, ist aber ohne jegliche Mittel, um die Mitteilung wird zugestellt, wenn das Objekt verlassen wird.
InformationsquelleAutor
With
- Anweisungen/BlöckeDies ist sowohl wahr als auch nicht wahr. Es ist wahr in dem Sinne, dass alle Objekte "markiert" (Puristen vielleicht Haarspalterei mit dieser Terminologie, aber die details sind nicht relevant) bereit für die Müllabfuhr, wenn Sie gehen out of scope. Aber dann in diesem Sinne ist es auch nicht ganz richtig, da gibt es nichts besonderes über die
With
Schlüsselwort mit Bezug auf dieses Verhalten. Wenn ein Objekt den Gültigkeitsbereich verlässt, ist es für die garbage collection freigegeben. Zeitraum. Dies gilt auch für method-level-Bereich und es ist wahr für block-level-Bereich (z.B.With
,For
,Using
usw.).Aber das ist nicht der Grund, warum Sie verwenden
With
. Der Grund dafür ist, dass es ermöglicht, mehrere Eigenschaften in der Reihenfolge auf eine tief verschachtelte Objekt. In anderen Worten, angenommen, Sie haben ein Objekt, auf dem Sie festlegen möchten, die ein Bündel von Eigenschaften, und Sie sind es auf diese Weise:MyClass.MemberClass.AnotherMemberClass.Items(0)
. Sehen Sie alle diese Punkte? Es können (theoretisch) werden, ineffizienten code zu schreiben, der hat durch die Arbeit, die Reihe von Punkten über und über, um Zugriff auf die genau gleichen Objekt jedes mal, wenn Sie eine Eigenschaft festlegen. Wenn Sie wissen nichts über C oder C++ (oder einer anderen Sprache, die Zeiger), Sie können denken Sie an jedem dieser Punkte bedeutet eine Zeiger-Dereferenzierung. DieWith
Aussage im Grunde geht durch alle diese Dereferenzierung nur einmal, speichern Sie das resultierende Objekt wird in eine temporäre variable, und so dass Sie zum festlegen von Eigenschaften direkt auf das Objekt in die temporäre variable.Vielleicht etwas code würde helfen, die Dinge klarer. Wenn Sie sehen, ein Punkt, denke könnte langsam sein!
Davon ausgehen, dass Sie beginnen mit dem folgenden code, abrufen von Objekt 1 aus einer tief verschachtelten
Items
Sammlung und Einstellung mehrere Eigenschaften auf. Sehen Sie, wie viele Male haben wir, um das Objekt abzurufen, obwohl es genau das gleiche Objekt, jedes mal?Wir jetzt ändern, der code
With
block:Den Effekt hier ist allerdings identisch mit dem folgenden code:
Gewährt, Sie nicht einzuführen, einen neuen Bereich, so
tempObj
gehen nicht aus von Umfang (und damit für die garbage collection freigegeben), bis die höheren level-Bereich endet, aber das ist kaum ein Relevantes Thema. Der performance-Vorteil (wenn überhaupt) wird an beide die letzten beiden code-snippets.Den real gewinnen mit
With
Blöcke heute ist nicht die Leistung, sondern die Lesbarkeit. Für weitere Gedanken überWith
mögliche performance-Verbesserungen, die stilistischen Anregungen, und so weiter, siehe die Antworten auf diese Frage.With New
?Hinzufügen der
New
Schlüsselwort, um eineWith
Aussage hat genau die gleiche Wirkung, die wir gerade besprochen (eine lokale temporäre variable, um das Objekt), mit der Ausnahme, dass es fast völlig sinnlos. Wenn Sie brauchen, um ein Objekt zu erstellen mitNew
können Sie auch eine variable deklarieren, um es zu halten. Du bist wahrscheinlich gehen zu müssen, um tun etwas mit, dass ein Objekt, das später, wie pass es zu einer anderen Methode, und Sie können nicht tun, in einerWith
block.Es scheint, dass der einzige Zweck der
With New
ist, dass es erlaubt Ihnen, vermeiden eine explizite Deklaration von Variablen, statt dass der compiler tun es stillschweigend. Rufen Sie mich verrückt, aber ich sehe keinen Vorteil in diesem.In der Tat, ich kann sagen, dass ich ehrlich gesagt noch nie gesehen, jede tatsächliche code, der verwendet diese syntax. Das einzige, was ich finden kann Google Unsinn wie diese (und
Call
ist eine viel bessere alternative gibt es sowieso).Using
- Anweisungen/BlöckeIm Gegensatz zu
With
,Using
ist unglaublich nützlich und sollten treten Häufig in typischen VB.NET code. Es ist jedoch sehr begrenzt in Ihrer Anwendbarkeit: es funktioniert nur mit Objekten, deren Typ implementiert dieIDisposable
interface-pattern. Sie erkennen dies, indem Sie prüfen, ob für das Objekt einDispose
Methode, dass Sie anrufen sollen, wenn Sie fertig sind, um zum release alle nicht verwalteten Ressourcen.Ist, durch die Art und Weise, in der Regel sollte man immer Folgen, wenn ein Objekt über eine
Dispose
Methode: Sie sollten immer es nennen, wenn du fertig bist mit dem Objekt. Wenn Sie nicht, es ist nicht unbedingt das Ende der Welt—der garbage collector kann sparen Ihre Speck—aber es ist ein Teil der dokumentierten Vertrag und immer gute Praxis auf Ihrem Teil zu nennenDispose
für jedes Objekt zur Verfügung stellt.Wenn Sie versuchen, wickeln Sie die Erstellung von ein Objekt, das nicht implementieren
IDisposable
imUsing
block, der compiler an zu bellen, als Sie und ein Fehler generiert. Es macht keinen Sinn, für alle anderen Arten, da Ihre Funktion im wesentlichen äquivalent zu einemTry
/Finally
block:Aber das ist hässlich und wird es eher unhandlich werden, wenn Sie anfangen zu nisten (wie hätten wir erstellt eine
Pen
- Objekt, das benötigt wird, um entsorgt werden). Stattdessen verwenden wirUsing
, das hat den gleichen Effekt:Den
Using
- Anweisung funktioniert sowohl mit Objekten werden Sie den Erwerb (über dieNew
Schlüsselwort oder durch den Aufruf einer Methode wieCreateGraphics
), und mit Objekten, die Sie bereits erstellt haben. In beiden Fällen sorgt Sie dafür, dass dieDispose
Methode aufgerufen wird, selbst wenn eine exception wird geworfen, irgendwo im inneren des Blocks, die dafür sorgt, dass das Objekt nicht verwaltete Ressourcen erhalten, ordnungsgemäß zu entsorgen.Es erschreckt mich ein wenig, dass Sie haben code geschrieben in VB.NET ohne wissen über die
Using
- Anweisung. Sie es nicht verwenden für die Erstellung aller Objekte, aber es ist sehr wichtig, wenn Sie den Umgang mit Objekten, die zur Umsetzung vonIDisposable
. Sie sollten auf jeden Fall gehen Sie zurück und re-überprüfen Sie Ihren code, um sicherzustellen, dass Sie es gegebenenfalls!With New
Schlüsselwort, es spart eine variable deklarieren, die ich denke, ist gut, wenn das Objekt die Verwendung beschränkt sich auf die Methode und wird nur einmal verwendet. Ich sollte wohl umschreiben, dass alles, was mitUsing
jetzt, aber da ich immerWith
und dannTry Catch Finally
zu entsorgen ist mein Objekt-ich glaube, ich bin zu gut für jetzt 🙂Hier ist ein Beispiel, wie würde ich
With New
stackoverflow.com/questions/15423898/... selbstverständlich würde es viel schöner Aussehen mitUsing
, aber sehen Sie etwas kritisch falsch mit, dass?Ich Stimme mit @yu_ominae; es ist toll zu können, gehen Sie einfach
With New MySubForm ... do stuff ... End With
da Sie nicht viel tun, mit einem sub-form, sobald Sie den dialog führen. Eine Sache würde ich Liebe zu sehen in einemWith
block tho ist die Fähigkeit zu haben, ein kurzer-hand die Referenz auf das Objekt gewickelt über, sagen wir, zwei Punkte (..) oder Hut (^).InformationsquelleAutor
Ist der Unterschied in der
Using With...End End
Anrufe
cn.Dispose()
automatisch, wenn going out of scope (End Using
). Aber in derWith New...End
.Dispose() nicht explizit aufgerufen wird.
Auch mit der Namen-Objekt erstellen, können Sie Uhren und
?cn
im Direktfenster. Mit der Unbenannte Objekte, die Sie nicht können.InformationsquelleAutor
Mit Verbindung... End Mit : Vorsicht !!!
Diese Aussage wird in der Nähe Ihrer Datenbank Verbindung !
In der Mitte von einem Modul oder Formular(en), ich.e.das hinzufügen oder aktualisieren von Datensätzen, diese beendet die Verbindung. Wenn Sie versuchen, einen weiteren Betrieb in diesem Modul erhalten Sie einen Datenbank-Fehler. Für verbindungen, die ich nicht mehr nutze. Sie können die Verwendung von Try... End Try-wihthouth die Using-Anweisung.
Öffne ich die Verbindung bei der Eingabe an das Modul, und schließen Sie es nach dem beenden. Das löst das problem.
InformationsquelleAutor