none
Instanciar classe global, local ou pelo construtor? RRS feed

  • Pergunta

  • Bom dia, gostaria de saber qual a melhor forma de instanciar uma classe?

    Global: para ser utilizada em todas as funções e métodos dentro desta classe. Exemplo: Em um formulário cadastro.aspx posso utilizar o objeto instanciado no PageLoad(), no btnCadastrar_Click() e em todos os outros métodos e funções.

    Exemplo Global:(o tempo de vida desta instancia,creio eu seja até o fim da execução da classe)

    public partial class Cadastro : System.Web.UI.Page { //Poderá ser vista em toda a classe UsuarioBo obj_usuario = new UsuarioBo();

    protected void Page_Load(object sender, EventArgs e) { } }

    Local: dentro de uma função ou método utilizando-a só dentro daquele bloco de código.

    Exemplo Local:(o tempo de vida desta instancia,creio eu seja até o fim da execução da do método ou função)

     public partial class Cadastro : System.Web.UI.Page
     {
            protected void btnCadastrar_Click(object sender, EventArgs e)
            {
                 UsuarioBo obj_usuario = new UsuarioBo();
            }
     }

    Construtor: através do construtor da classe, onde declaro a variável do tipo da classe e depois instancio-a dentro do construtor da mesma. O objeto desta classe poderá ser visto de toda a classe.

    Exemplo Global:(o tempo de vida desta instancia, não faço idéia...rs)

     public partial class Cadastro : System.Web.UI.Page
     {
            UsuarioBo obj_usuario;
            
           //Construtor
           public Cadastro(){
              obj_usuario = new UsuarioBo();
           }
    
            protected void Page_Load(object sender, EventArgs e)
            {
            }
     }


    quinta-feira, 23 de agosto de 2012 13:03

Respostas

  • Amigo, todas as formas estão corretas. O que vai definir qual modo usar depende da sua necessidade.

    O conceito de classes se confunde porque algumas pessoas perdem a noção de que uma classe deve, pela UML, representar uma entidade. Desta forma, acabam criando classes com o único intuito de prover métodos que realizam cálculos sem que necessariamente constitua a representação de um objeto físico. Não penso que esteja errado, afinal temos situações que a ideia de identidade não se aplica.

    Vamos supor que você deseja usar uma classe que contenha funções de acesso a banco como ExecuteReader, ExecuteNonQuery e ExecuteScalar. Se você precisar acessar esses métodos em mais de um método na sua página, então vale a pena criar uma instância global. Desta forma você economiza memória com uma instância apenas. Se você usar estes métodos em apenas um método, instancie local.

    Geralmente quando se cria uma instância global, mistura-se o conceito de instância global e construtor. Isso porque, como a cada requisição perde-se a referência ao objeto criado, ou não vale o custo de se criar instâncias todas vez que houver um postback, é interessante usar o ViewState. Então você usa o PageLoad() como uma construtor e instancia uma vez só a classe, criando um objeto no ViewState.

    Segue um exemplo meu:

    Variavel global com property:

            public Usuario _usr
            {
                get { return (Usuario)ViewState["usr"]; }
                set { ViewState["usr"] = value; }
            }

    Instância:

            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {                
                    _usr = new Usuario();                
                }
            }


    Rafael Santos

    Observações:
    1. Selecione a opção "Habilitar o Live Alerts por Padrão" nas suas configurações para que possa acompanhar em tempo real as atividades relacionadas a sua Thread;
    2. Não abandone sua Thread. Ao perguntar, fique atento às respostas; ao encontrar uma solução, compartilhe;
    3. As pessoas que dedicam seu tempo na busca por soluções para você não ganham nada em troca. Valorize-as e em forma de agradecimento pontue as respostas corretas.

    "Quem disse que não escrevo poesias? A diferença é que as minhas começam com using System;"


    quinta-feira, 23 de agosto de 2012 18:08