Pergunta

Eu sempre li que ele é recomendado para conjunto de objetos a nada, uma vez que eu sou feito com eles. Mas eu normalmente usá-los apenas em funções dentro de formas.

Não é a referência perdido ea memória liberada quando o escopo de função é deixado, independentemente da definição de objetos como Nothing?

i. É realmente necessário fazer:

Set db = Nothing
Set record_set = Nothing
Foi útil?

Solução

VB usa um chamado coletor de lixo "contagem de referência".

Basicamente, a variável de um momento sai do escopo, o contador de referência no objecto referenciado é decrementado. Quando você atribui a referência do objeto para outra variável, o contador de referência é incrementado.

Quando o contador chegar a zero, o objeto está pronto para a coleta de lixo. Os recursos do objeto será liberada logo que isso acontece. Uma variável local função de referência mais provável um objeto cuja contagem de referência não for superior a 1, portanto, objeto recursos serão liberados quando termina a função.

A definição de uma variável para Nothing é o caminho para diminuir o contador de referência explicitamente.

Por exemplo, você lê em um arquivo, e definir a variável de objeto de arquivo para Nothing logo após a chamada ReadAll(). O identificador de arquivo será liberado imediatamente, você pode tomar seu tempo processar seu conteúdo.

Se você não definir a Nothing, o identificador de arquivo pode ser aberto por mais tempo do que o absolutamente necessário.

Se você não está em um "deve desbloquear recurso valioso" tipo de situação, simplesmente deixar as variáveis ??ir fora do escopo está bem.

Outras dicas

A coleta de lixo é raramente perfeita. Mesmo em .NET há momentos em que você está fortemente encorajados a levar o sistema para fazer a coleta de lixo cedo.

Por esta razão, eu explicitamente tanto Fechar e defina a Nada de registros quando eu terminar com eles.

A última linha do tópico de ajuda para " Recordset.Close " na ajuda do Microsoft DAO eo desenvolvedor Acesso referência é o seguinte:

"Uma alternativa para o método Close é para ajustar o valor de uma variável de objecto to Nothing (Conjunto dbsTemp = Nada) ".

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

Com isso em mente, este artigo a partir da Base de Conhecimento da Microsoft intitulado "Como prevenir banco de dados inchaço depois de usar o Data Access Objects (DAO)", diz-lhe que você deve fechar explicitamente se você não quer que seus bancos de dados para o inchaço. Você vai notar que o artigo é um pouco vago sobre os detalhes; seção "Causa" não é clara, quase ao ponto de ser jargão.

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

Sintomas: base de dados do Microsoft Access começou a inchar (ou crescer rapidamente em tamanho) após implementar Data Access Objects (DAO) para abrir um conjunto de registros.

Causa: Se você não liberar um memória do conjunto de registros a cada vez que você laço através do código de registos, DAO pode recompilar, usando mais memória e aumentar o tamanho do banco de dados.

MAIS INFORMAÇÕES: Quando você cria um De registos (ou um QueryDef) em objecto código, explicitamente fechar o objeto quando Você terminou. Microsoft Access fecha-se automaticamente e de registos QueryDef objetos sob mais circunstâncias. No entanto, se você fechar explicitamente o objeto em sua código, você pode evitar ocasionais casos em que o objecto permanece aberto.

Por fim, deixe-me acrescentar que tenho vindo a trabalhar com bancos de dados de acesso por 15 anos, e eu quase sempre deixar meus variáveis ??de registros declarados localmente ir fora do escopo sem usar explicitamente o método Close. Eu não fiz qualquer teste sobre ele, mas ele não parece importar.

As referências devem ser limpos quando a variável sai do escopo. Presumivelmente, isso tem melhorado com versões posteriores do software, mas era de uma só vez não confiável. Eu acredito que ela continua sendo uma boa prática para explicitamente definir variáveis ??para "Nada."

Quando você estiver usando ASP clássico (scripting do lado do servidor), é de importação para definir todos os objetos para nada quando você é completamente com eles, porque eles não vão fora do escopo até que o servidor [virtual] está desligado.

objetos Por esta razão, todos os exemplos de script MS VB sempre demonstrou ser fechado e definido para nada. Assim que os trechos de script poderia ser usado em ambientes como ASP clássicos onde os objetos não sair do escopo.

Existem, raramente, outras situações onde você deseja código processos de longa duração, onde os objetos não vá fora do escopo, e você encontrar-se a ficar sem memória física, se você não liberar explicitamente objetos.

Se você se encontra codificação ASP clássico, ou a execução de processos em âmbito mundial por algum outro motivo, então sim, você deve liberar explicitamente objetos.

Normalmente, eu sempre colocar isso no final dos meus procedimentos, ou chamar um sub "CloseRecordSet" com ele em se eu estou usando os nível de módulo:

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

Dessa forma, no entanto as extremidades procedimento, (seja normalmente ou devido a um erro) os objetos são limpas e os recursos são gratuitos.

Fazendo isso dessa forma é bastante seguro na medida em que você só pode bater-lo e ele só vai fazer o que é necessário em relação ao fechamento, ou destruir o objeto de registros / conexão, Incase que já foi fechado (devido a uma erro de execução ou simplesmente fechá-lo mais cedo ya deveria, isso só faz certeza).

Não é realmente muito trabalho e é sempre melhor para limpar seus objetos quando terminar com eles para liberar recursos imediatamente, independentemente do que acontece no programa.

Tente este

If Not IsEmpty(vMyVariant) Then
    Erase vMyVariant
    vMyVariant = Empty
End If
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top