none
Dispose RRS feed

  • Pergunta

  • Ola amigos... Dentro de POO usando VB net ou C# como eu sei quais objetos estão alocados na memoria.

    por exemplo:

     

    Dim Cliente as ClasseCliente = new ClasseCliente

    Como eu posso saber de ele está lá ou o GC destruiu esse objeto.

    quarta-feira, 23 de março de 2011 02:55

Respostas

  • Não Vanderney,

    Você não entendeu minha resposta.

    A implementação de IDisposable está certa. Só é desnecessária. Não serve pra nada no código acima. Você vai fazer sua classe passar pelo processo de Dispose desnecessariamente, já que ela não gerencia nenhum tipo de recurso NÃO-GERENCIADO (handles, arquivos, etc).

    Mesmo executando "Dispose" na sua classe, ela NÃO será liberada da memória.

    Isso é uma característica do ambiente gerenciado do .NET e é assim mesmo que foi projetado. A responsabilidade do programador é somente não largar nenhuma referência pendurada para a classe e o garbage collector irá liberar a memória no momento que ELE achar apropriado (você não tem controle sobre quando ele vai passar).

     

    Abraço,

    Eric

    • Marcado como Resposta Vanderney Souza quinta-feira, 24 de março de 2011 12:50
    quinta-feira, 24 de março de 2011 11:52
  • Vanderney,

    A explicação é bem simplista, mas acho que encaixa para sua dúvida.

    Enquanto houver uma referência para essa instância, ela estará viva.

    O GC trabalha com contagem de referências. A medida que as várias que apontam para essa instância saem de escopo e são desalocadas, no momento em que chega a "zero" referências, o objeto é marcado para destrução.

    Na próxima passada do GC ele pode (ou não) liberar o objeto.

     

    Abraço,

    Eric

    • Sugerido como Resposta Eduardo Cury quarta-feira, 23 de março de 2011 16:05
    • Marcado como Resposta Vanderney Souza quinta-feira, 24 de março de 2011 12:50
    quarta-feira, 23 de março de 2011 12:28
  • Vandernei,

     

    O método Dispose() e a interface IDisposable devem ser usados quando uma classe gerenciada utiliza-se de um recurso não gerenciado (Ex.: Um arquivo, um handle, uma conexão de banco).

    A idéia é um mecanismo para a liberação deste recurso.

    No caso, se a sua classe não se utiliza de nenhum recurso não gerenciado, você não precisa implementar o Dispose.

    Se ela é global, vai ter o tempo de vida da aplicação, já que existe uma referência apontando para a instância do objeto no Managed Heap.

     

    Abraço,

    Eric

    • Marcado como Resposta Vanderney Souza quinta-feira, 24 de março de 2011 12:50
    quinta-feira, 24 de março de 2011 01:51

Todas as Respostas

  • Vanderney,

    A explicação é bem simplista, mas acho que encaixa para sua dúvida.

    Enquanto houver uma referência para essa instância, ela estará viva.

    O GC trabalha com contagem de referências. A medida que as várias que apontam para essa instância saem de escopo e são desalocadas, no momento em que chega a "zero" referências, o objeto é marcado para destrução.

    Na próxima passada do GC ele pode (ou não) liberar o objeto.

     

    Abraço,

    Eric

    • Sugerido como Resposta Eduardo Cury quarta-feira, 23 de março de 2011 16:05
    • Marcado como Resposta Vanderney Souza quinta-feira, 24 de março de 2011 12:50
    quarta-feira, 23 de março de 2011 12:28
  • Está Ok.

    Mas na verdade eu fiz esta pergunta pois implementei no meu cliente o Dispose e

    queria saber se está certo e está funcionando

    Public Class C_Clientes
      Implements IDisposable
    
    #Region " IDisposable Support "
      Private disposed As Boolean = False
    
      Protected Overridable Sub Dispose(ByVal disposing As Boolean)
        If Not disposed Then
          If disposing Then
          End If
        End If
        disposed = True
      End Sub
      Public Sub Dispose() Implements IDisposable.Dispose
        Dispose(True)
        GC.SuppressFinalize(Me)
      End Sub
    
      Protected Overrides Sub Finalize()
        Try
          Dispose(False)
        Finally
          MyBase.Finalize()
        End Try
      End Sub
    
    #End Region
    
    End Class

    Dai eu crio por exemplo dentro de uma movimentacao

    Dim Cliente as C_Clientes = new C_Clientes
    

    Dai após eu não precisar mais desse objeto eu uso o Cliente.Dispose()

     

    Eu estou fazendo certo???

    T+

     

    quarta-feira, 23 de março de 2011 13:02
  • Ola amigos... Dentro de POO usando VB net ou C# como eu sei quais objetos estão alocados na memoria.

    por exemplo:

     

    Dim Cliente as ClasseCliente = new ClasseCliente

    Como eu posso saber de ele está lá ou o GC destruiu esse objeto.

    http://msdn.microsoft.com/en-us/library/system.idisposable.aspx#Y826
    Just Be Humble Malange!
    quarta-feira, 23 de março de 2011 14:32
  • Para ter certeza que ele será coletado pelo GC você pode colocar ele dentro de blocos using(){}

    http://msdn.microsoft.com/pt-br/library/yh598w02%28v=vs.80%29.aspx



    quarta-feira, 23 de março de 2011 15:27
  • Isso seria uma boa idéia mas

    não é meu caso mas se declarar esse Cliente com global

    com ficaria?

     

    E o que eu queria verificar é se eu estou fazendo correto a implementação do Dispose

    quarta-feira, 23 de março de 2011 16:52
  • Vandernei,

     

    O método Dispose() e a interface IDisposable devem ser usados quando uma classe gerenciada utiliza-se de um recurso não gerenciado (Ex.: Um arquivo, um handle, uma conexão de banco).

    A idéia é um mecanismo para a liberação deste recurso.

    No caso, se a sua classe não se utiliza de nenhum recurso não gerenciado, você não precisa implementar o Dispose.

    Se ela é global, vai ter o tempo de vida da aplicação, já que existe uma referência apontando para a instância do objeto no Managed Heap.

     

    Abraço,

    Eric

    • Marcado como Resposta Vanderney Souza quinta-feira, 24 de março de 2011 12:50
    quinta-feira, 24 de março de 2011 01:51
  • Desculpa se estou amolando de mais, mas 

    a forma que apresentei acima está correta?

    ou não.

     

    T+

    • Não Marcado como Resposta Vanderney Souza quinta-feira, 24 de março de 2011 15:25
    quinta-feira, 24 de março de 2011 03:37
  • Não Vanderney,

    Você não entendeu minha resposta.

    A implementação de IDisposable está certa. Só é desnecessária. Não serve pra nada no código acima. Você vai fazer sua classe passar pelo processo de Dispose desnecessariamente, já que ela não gerencia nenhum tipo de recurso NÃO-GERENCIADO (handles, arquivos, etc).

    Mesmo executando "Dispose" na sua classe, ela NÃO será liberada da memória.

    Isso é uma característica do ambiente gerenciado do .NET e é assim mesmo que foi projetado. A responsabilidade do programador é somente não largar nenhuma referência pendurada para a classe e o garbage collector irá liberar a memória no momento que ELE achar apropriado (você não tem controle sobre quando ele vai passar).

     

    Abraço,

    Eric

    • Marcado como Resposta Vanderney Souza quinta-feira, 24 de março de 2011 12:50
    quinta-feira, 24 de março de 2011 11:52
  • Agora sim entendi

     

    Muito obrigado.

     

    T+

    quinta-feira, 24 de março de 2011 12:49