Domanda

ho sempre letto che si consiglia di impostare gli oggetti a nulla, una volta che mi sono fatto con loro. Ma io di solito li uso solo nelle funzioni all'interno forme.

Non è il riferimento perduta e la memoria rilasciata quando il campo di applicazione funzione viene lasciato, indipendentemente dalle impostazioni degli oggetti a Nothing?

vale a dire. E 'davvero necessario fare:

Set db = Nothing
Set record_set = Nothing
È stato utile?

Soluzione

VB utilizza un cosiddetto "conteggio di riferimento" garbage collector.

In sostanza, il momento in cui una variabile passa nell'ambito, il contatore di riferimento dell'oggetto di riferimento viene decrementato. Quando si assegna il riferimento all'oggetto a un'altra variabile, il contatore viene incrementato di riferimento.

Quando il contatore raggiunge lo zero, l'oggetto è pronto per la raccolta dei rifiuti. Le risorse oggetto sarà rilasciato non appena questo accade. Una variabile locale funzione sarà molto probabilmente riferimento a un oggetto il cui conteggio di riferimento non va mai superiore a 1, in modo da opporsi risorse saranno rilasciati quando la funzione termina.

L'impostazione di una variabile per Nothing è il modo per diminuire il contatore di riferimento in modo esplicito.

Per esempio, si legge in un file, e impostare la variabile oggetto file a ReadAll() subito dopo la chiamata <=>. L'handle di file sarà rilasciato immediatamente, si può prendere il vostro processo di tempo il suo contenuto.

Se non si imposta al <=>, l'handle di file potrebbe essere aperto più a lungo del necessario.

Se non si è in una sorta di "deve sbloccare risorsa preziosa" della situazione, semplicemente lasciando le variabili vanno fuori del campo di applicazione va bene.

Altri suggerimenti

Garbage Collection è raramente perfetto. Anche in .NET ci sono momenti in cui si sono fortemente incoraggiati a spingere il sistema a fare la raccolta dei rifiuti in anticipo.

Per questo motivo, ho esplicitamente sia Chiudi e impostato su Niente di record quando ho finito con loro.

L'ultima riga del l'argomento della Guida per " Recordset.Close " nella Guida in DAO Microsoft e l'Access Developer di riferimento è questo:

  

"Un'alternativa al metodo Close è   per impostare il valore di una variabile oggetto   Nothing (Set dbsTemp = Nothing) ".

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

Con questo in mente, questo articolo dalla Microsoft Knowledge Base intitolato "Come prevenire la banca dati gonfiare dopo l'utilizzo di Data Access Objects (DAO)", ti dice che si dovrebbe esplicitamente vicino se non volete i database a gonfiare. Si noterà che l'articolo è un po 'vago sui dettagli; sezione "Cause" non è chiaro, quasi al punto di essere senza senso.

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

  

Sintomi: Un database di Microsoft Access   ha iniziato a gonfiare (o crescere rapidamente in   dimensioni) dopo aver implementato l'accesso ai dati   Objects (DAO) per aprire un recordset.

     

Causa: se non si rilascia una   memoria del set di record ogni volta che si   ciclo tramite il codice recordset, DAO   può ricompilazione, utilizzando più memoria e   aumentando la dimensione del database.

     

Informazioni: Quando si crea un   Recordset (o QueryDef) in   codice, chiudere in modo esplicito l'oggetto quando   sei finito. accesso Microsoft   chiude automaticamente Recordset e   Oggetti QueryDef in più   circostanze. Tuttavia, se si   chiudere in modo esplicito l'oggetto nella vostra   codice, è possibile evitare occasionali   casi in cui l'oggetto rimane   aperto.

Infine, mi permetta di aggiungere che ho lavorato con i database di Access per 15 anni, e ho quasi sempre lasciato le mie variabili recordset dichiarato localmente andare fuori del campo di applicazione, senza esplicito utilizzando il metodo Close. Non ho fatto alcun test su di esso, ma non sembra avere importanza.

I riferimenti dovrebbero essere ripulito quando la variabile va fuori di portata. Presumibilmente questo è migliorata con le versioni successive del software, ma era un tempo non affidabile. Credo che rimane una buona pratica impostare esplicitamente variabili di "Niente".

Quando si utilizza ASP classico (scripting server-side), è l'importazione di impostare tutti gli oggetti a nulla quando si è finito con loro, perché non andare fuori del campo di applicazione fino a quando il server [virtuale] è spento.

Per questo motivo, tutti gli esempi di script VB MS ha mostrato sempre oggetti che vengono chiuse e impostare a nulla. In modo che i brani di script potrebbe essere utilizzato in ambienti come ASP classico in cui gli oggetti non sono andate fuori del campo di applicazione.

Ci sono, raramente, altre situazioni in cui si desidera codificare processi di lunga durata in cui gli oggetti non vanno fuori portata, e ti ritrovi a corto di memoria fisica, se non si rilascia in modo esplicito gli oggetti.

Se vi trovate a codifica ASP classico, o l'esecuzione di processi in ambito globale per qualche altra ragione, allora sì, si dovrebbe rilasciare in modo esplicito gli oggetti.

Io di solito sempre messo questo alla fine dei miei procedure, o chiamare un sub "CloseRecordSet" con esso in se sto usando quelli livello di modulo:

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

In questo modo tuttavia la procedura termina, (sia esso normalmente oa causa di un errore) gli oggetti vengono puliti e risorse sono disponibili.

Facendo in questo modo è abbastanza sicuro nel senso che si può solo schiaffo in e sarà solo fare ciò che è necessario, per quanto riguarda la chiusura, o distruggere l'oggetto recordset / connessione, in caso è già stato chiuso (a causa di una errore di runtime o semplicemente chiudendola già nel ya dovrebbe, questo fa solo sicuro).

La sua realtà non molto fastidio e la sua sempre migliore per pulire i vostri oggetti quando hai finito con loro per liberare risorse immediatamente indipendentemente da ciò che accade nel programma.

Prova questo

If Not IsEmpty(vMyVariant) Then
    Erase vMyVariant
    vMyVariant = Empty
End If
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top