Frage

Ich lese immer, dass es empfohlen wird, um Objekte zu nichts zu setzen, sobald ich mit ihnen fertig bin. Aber ich sie normalerweise nur innerhalb von Formen in Funktionen verwenden.

Ist das nicht der Verweis verloren und Speicher freigegeben, wenn der Funktionsumfang bleibt, unabhängig von Objekten auf Nothing festlegen?

d. ist es wirklich notwendig zu tun:

Set db = Nothing
Set record_set = Nothing
War es hilfreich?

Lösung

VB verwendet eine sogenannte "Referenzzählung" Garbage Collector.

Grundsätzlich ist der Moment, eine Variable den Gültigkeitsbereich verlässt, wird der Referenzzähler auf das referenzierte Objekt erniedrigt. Wenn Sie das Objekt Verweis auf eine andere Variable zuweisen, wird der Referenzzähler erhöht.

Wenn der Zähler Null erreicht, ist das Objekt für die Garbage Collection bereit. Die Objektressourcen werden, sobald dies geschieht freigegeben werden. Eine Funktion lokale Variable wird höchstwahrscheinlich verweisen auf ein Objekt, dessen Referenzzähler geht nie höher als 1 ist, so wird das Objekt Ressourcen freigegeben werden, wenn die Funktion beendet.

eine variable Einstellung ist der Weg Nothing die der Referenzzähler ausdrücklich zu verringern.

Zum Beispiel lesen Sie in einer Datei, und setzen Sie die Variable Dateiobjekt direkt nach dem Nothing Aufruf ReadAll(). Die Datei-Handle wird sofort freigegeben werden, können Sie Ihre Zeit Prozess seinen Inhalt übernehmen.

Wenn Sie nicht auf Nothing gesetzt haben, kann die Datei-Handle geöffnet länger als unbedingt notwendig.

Wenn Sie nicht in einem sind „müssen wertvolle Ressource entsperren“ Art von Situation, einfach lassen sich die Variablen außerhalb des Gültigkeitsbereichs gehen in Ordnung ist.

Andere Tipps

Die Garbage-Collection ist selten perfekt. Auch in .NET gibt es Zeiten, in denen Sie stark gefördert werden, das System zu veranlassen frühen Garbage Collection zu tun.

Aus diesem Grund habe ich ausdrücklich beide schließen und auf Nichts Cord-Sets, wenn ich mit ihnen gemacht.

Die letzte Zeile des Hilfethema für „ Recordset.Close “in der DAO-Hilfe von Microsoft und dem Access Developer Reference ist dies:

  

"Eine Alternative zu der Close-Methode ist   den Wert einer Objektvariable einzustellen   to Nothing (Set dbsTemp = Nothing). "

http://msdn.microsoft.com/en-us/library/ bb243098.aspx

Mit dem im Verstand, dieser Artikel aus der Microsoft Knowledge Base des Titel „Wie Datenbank zu verhindern aufblasen, nachdem Sie Data Access Objects (DAO)“verwenden, sagt Ihnen, dass Sie explizit schließen sollten, wenn Sie nicht möchten, dass Ihre Datenbanken aufblasen. Sie werden feststellen, dass der Artikel ein wenig vage über die Details ist; der Abschnitt „Ursache“ ist unklar, fast bis zu dem Punkt Kauderwelsch zu sein.

http://support.microsoft.com/kb/289562

  

Problembeschreibung: Eine Microsoft Access-Datenbank   hat zu aufblasen begonnen (oder wachsen schnell in   Größe), nachdem Sie Data Access implementieren   Objects (DAO) ein Re-Cord zu öffnen.

     

Ursache: Wenn Sie nicht loslassen ein   Cord-Speicher jedes Mal, wenn Sie   Schleife durch den Cord-Code, DAO   kann neu kompilieren, mit mehr Speicher und   Erhöhung der Größe der Datenbank.

     

Weitere Informationen: Wenn Sie eine erstellen   Datensatzgruppe (oder ein QueryDef) -Objekt in   Code, schließen Sie das Objekt explizit, wenn   Du bist fertig. Microsoft Access   automatisch geschlossen-Cord und   QueryDef-Objekte unter den meisten   Umstände. Wenn Sie jedoch   schließt das Objekt explizit in Ihrem   Code können Sie gelegentlich vermeiden   Fälle, in denen das Objekt bleibt   offen.

Abschließend möchte ich hinzufügen, dass ich seit 15 Jahren mit Access-Datenbanken gearbeitet, und ich meine lokal erklärt Cord-Variablen Umfang fast immer gehen lassen, ohne explizit die Close-Methode zu verwenden. Ich habe keine Prüfung auf es getan, aber es scheint keine Rolle zu.

Referenzen sollen bereinigt werden, wenn die Variable den Gültigkeitsbereich verlässt. Vermutlich hat dies mit späteren Versionen der Software verbessert, aber es war auf einmal nicht zuverlässig. Ich glaube, dass es eine gute Praxis bleibt explizit Variablen gesetzt „Nichts.“

Wenn Sie ASP classic verwenden (Server-Side-Scripting), es Import ist es, alle Objekte zu nichts setzen, wenn Sie mit ihnen fertig sind, weil sie außerhalb des Gültigkeitsbereichs gehen Sie nicht, bis die [virtuellen] Server heruntergefahren wird.

Aus diesem Grund werden alle MS VB scripting Beispiele zeigten immer Objekte geschlossen und auf nichts. Damit die Drehbuchauszüge in Umgebungen wie ASP classic verwendet werden könnten, wo die Objekte nicht den Gültigkeitsbereich verlassen.

Es gibt selten, andere Situationen, in denen Sie wollen lang laufenden Prozesse codieren, wo die Objekte außerhalb des Bereichs nicht gehen, und Sie finden sich aus dem physischen Speicher ausgeführt wird, wenn Sie nicht explizit Objekte freigeben.

Wenn Sie sich Codierung ASP classic finden oder laufende Prozesse in globalen Bereich aus einem anderen Grund, dann ja, dann sollten Sie Objekte explizit freigeben.

ich dies in der Regel immer am Ende meines technischen Verfahrens oder eine „CloseRecordSet“ sub rufe damit, wenn ich Modulebene diejenigen bin mit:

Private Sub Rawr()
On Error GoTo ErrorHandler

    'Procedural Code Here.

    ExitPoint:
        'Closes and Destroys RecordSet Objects.
        If Not Recset Is Nothing Then
            If Recset.State = 1 Then
                Recset.Close
                Conn.Close
            End If
            Set Recset = Nothing
            Set Conn = Nothing
        End If
        Exit Sub

    ErrorHandler:
        'Error Handling / Reporting Here.
        Resume ExitPoint
End Sub

Auf diese Weise jedoch das Verfahren endet, (es zu einem Fehler normal oder fällig) die Gegenstände gereinigt und Ressourcen sind frei.

Doing es auf diese Weise sicher ist recht, dass es können Sie einfach es Schlag in und es wird nur das tun, was in Bezug auf die Schließung erforderlich ist, oder zu zerstören das Re-Cord / Verbindungsobjekt, einhüllen es bereits geschlossen worden ist (aufgrund einer Laufzeitfehler oder Schließen es nur früh wie ya sollte dies nur macht sicher).

Es ist wirklich nicht viel Mühe und es ist immer am besten Ihre Objekte zu bereinigen, wenn Sie mit ihnen fertig sind, Ressourcen zu sofort unabhängig davon, was im Programm passiert.

Versuchen Sie, diese

If Not IsEmpty(vMyVariant) Then
    Erase vMyVariant
    vMyVariant = Empty
End If
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top