none
Dúvida básica sobre instanciar classe RRS feed

  • Pergunta

  • Pessoal, bom dia.

    Não sei se a pergunta esta no forum correto, mas creio eu que sim, então vai la.

    Todos sabemos que uma conexão a banco deve seguir aquela regra de , abra o mais tarde possível e feche o mais cedo possível.

    Imaginando que eu tenha uma classe que precise utiizar várias vezes em vários eventos da página, qual seria a forma correta de instanciar e utilizá-la ?


    opcao 1 - Instanciar a classe fora de qualquer evento, utilizar dentro dos eventos e finalizar tudo em algum evento do tipo page_unload

    partial class pagina
    
    dim classe1 as new classe1
    dim classe2 as new classe2
    
    sub page_load(byval.....)
    
      classe1.facaqualquercoisa
      codigos,codigos,codigos
      classe2.facaqualquercoisa
      codigos,codigos,codigos
      codigos,codigos,codigos
    
    end sub 
    
    sub eventoqualquer()
    classe1.facaqualquercoisa
    codigos,codigos,codigos
    classe2.facaqualquercoisa
    codigos,codigos,codigos
    codigos,codigos,codigos

    end sub

    sub page_unload()
    classe1.dispose
    classe2.dispose
    end sub
     

    opcao 2  - instanciar e fechar tudo dentro de cada evento

    partial class pagina
    
    
    sub page_load(byval.....)
    
    dim classe1 as new classe1
    dim classe2 as new classe2
    
    
      classe1.facaqualquercoisa
      codigos,codigos,codigos
      classe2.facaqualquercoisa
      codigos,codigos,codigos
      codigos,codigos,codigos
    
      classe1.dispose
      classe2.dispose
    
    end sub 
    
    
    
    sub Eventoqualquer(byval.....)

    dim classe1 as new classe1
    dim classe2 as new classe2


    classe1.facaqualquercoisa
    codigos,codigos,codigos
    classe2.facaqualquercoisa
    codigos,codigos,codigos
    codigos,codigos,codigos

    classe1.dispose
    classe2.dispose

    end sub


    opcao 3 - instanciar quando for utilizar e fechar logo em seguida

    partial class pagina
    
    
    sub page_load(byval.....)
    
      dim classe1 as new classe1
      classe1.facaqualquercoisa
      classe1.dispose
    
      codigos,codigos,codigos
    
      dim classe2 as new classe2
      classe2.facaqualquercoisa
      classe2.dispose
    
      codigos,codigos,codigos
      codigos,codigos,codigos
    
    
      
    
    end sub 
    

    sub page_load(byval.....)

    dim classe1 as new classe1
    classe1.facaqualquercoisa
    classe1.dispose

    codigos,codigos,codigos

    dim classe2 as new classe2
    classe2.facaqualquercoisa
    classe2.dispose

    codigos,codigos,codigos
    codigos,codigos,codigos




    end sub



    OU... Nenhuma das alternativas :)

    Agradeço a dicas de vocês



    IpHouse Hospedagem - www.iphouse.com.br
    quarta-feira, 2 de dezembro de 2009 12:40

Respostas

  • Olá Rafael.

    Conexões com banco de dados são recursos não gerenciáveis, ou seja, o GC não pode destruir, pois simplesmente ele não o gerencia. Então, se você esquecer de fechar uma conexão, ela vai ficar aberta até que o SGBD dê um Kill nela por inatividade. Neste meio tempo ela ficará ociosa no pool consumindo recurso do servidor.
    Por isso as pessoas falam para abrir a conexão somente quando for necessário e SEMPRE fechá-la o quanto antes.

    Quanto e definição do escopo, devemos ter vários fatores em mente, vou descrever dois:
    • Há associação entre as classes? Caso sim, então é justificável criar uma classe como variável de instância e propriedade (encapsulamento)
    • Haverá uso destas classes aninhadas? Suponha que a classe A possua as classes B e C como propriedade, lembre-se que ao instanciar A, criar-se-á instâncias de B e C, ou seja, maior consumo de memória, tempo para alocação, etc..
    • Lembre-se que há custo computacional para criação e destruição de objetos.
    Para saber mais sobre isso recomendo estudar orientação a objetos.



    Agora quanto a destruição de objetos.

    Para usar o método Dispose o objeto deve implementar a interface IDisposable. Ou seja, qualquer classe que não implementar esta interface não haverá como utilizar este método.

    Geralmente implementa-se a interface IDisposable para classes que consomem recursos não gerenciáveis (Conexão com banco de dados, COM, arquivos, etc.)
    Para os objetos que não implementam IDisposable e caso queira ajudar o nosso querido amigo GC, marque os objetos que não tem mais uso como null.

    Espero ter ajudado

    Abraços
    quarta-feira, 2 de dezembro de 2009 17:45