none
Variavel private dentro de classe

    Pergunta

  • Normalmete qdo as pessoas escrevem classes, vejo frequentemente que logo no inicio setam uma variavel PRIVATE e que a mesma pode ser utilizada em varios metodos de toda a classe.

    Perguntas:

    1. Esta variavel é iniciada logo qdo algo instanciar essa classe certo ?
    E qdo essa variavel morrera ? Se eu instancio a classe ela nao ficara em memoria mesmo q eu nao precise mais ?

    2. Se ela nao pode ser utilizada em toda a classe, em todos os metodos, se eu alterar o valor dela os metodos tb nao vao pegar o valor alterado em vez de um valor que ela é iniciada ?

    Oque é melhor, setar as variaveis fora dos metodos (logo no topo) ou dentro deles ?

    sábado, 25 de maio de 2013 06:16

Todas as Respostas

  • Tentarei responder pelo que eu entendo:

    1. Esta variavel é iniciada logo qdo algo instanciar essa classe certo ?
    E qdo essa variavel morrera ? Se eu instancio a classe ela nao ficara em memoria mesmo q eu nao precise mais ?

    1.a) Se for variável de instância, ela será iniciada quando o objeto for instanciado.

    1.b) Aí entra a questão do ciclo de vida de uma var de instância. Se ela aponta para nenhum objeto, ela se torna candidata ao lixo. Quando se declara uma var de instância, o compilador aloca uma pequena parte da memória suficiente para especificar o endereço de(ou referência a) outro objeto. A memória real só será alocada, quando utilizar a palavra chave new. Eu posso ter duas variáveis apontando para o mesmo objeto, assim:

    Circle c = new Circle();

    Circle refc = c;

    Eu tenho aqui dois blocos de memória para o mesmo objeto Circle. Se Circle deixa de existir, essas referências perdem todo o sentido de sua existência e se candidatam à coleta de lixo. 

    2.a) Depende. Se eu crio uma variável e inicio ela. Depois pego essa variável e trabalho com ela em um método. O que aconteceu? Em realidade eu fiz uma cópia dessa variável em meu método e dei um outro valor para ela. E dentro desse método ela terá os valores que eu for passando para ela. Mas quando o método for terminado, tudo dentro dele morre. E essa variável? Aquela "cópia" que foi feita dela também, mas a variável que foi declarada fora do método, continua com seu valor original, ela só irá morrer quando o objeto em que ela está inserida, não mais estiver sendo utilizado, morrer também.

    2.b) Depende de como você vai utilizar a variável e o método. Se essa variável(estou raciocinando se for de instância a var) for utilizar em toda a classe, inicia-se no topo, como você diz. Se ela for utilizada apenas em determinado método, inicializa-se no método.

    domingo, 26 de maio de 2013 21:57
  • Amigo é básico o conceito,  variáveis fora de funções ou métodos sendo private, public e etc pode ser visto como uma propriedade da classe ela só aloca em memória quando inicializada, existe algumas maneiras de inicializar uma "propriedade" no método construtor, declarando elas como static ou quando vc instância a classe que ela pertence.

    Caso vc precise utilizar ela apenas uma vez, crie uma variável para o método corrente ou seja apenas dentro do bloco de código.

    Caso precise utilizar em outros lugares utiliza como uma propriedade (seria uma variável publica).

    Para desalocar memória o .net tem por default faz uma coleta dessas variáveis e jogar fora agora queira desalocar, vc pode utilizar a classe (System.IDisposable) garbage collection

     #region Implementação do IDisposable
            //Implement IDisposable.
            public void Dispose()
            {
                Dispose(true);
                GC.SuppressFinalize(this);
            }
    
            protected virtual void Dispose(bool disposing)
            {
    
            }
    
            ~HomeController()
            {
                // Dispose(false);
            }
    
            public class Derived : EmbaixadorasController
            {
                protected override void Dispose(bool disposing)
                {
                    base.Dispose(disposing);
                }
    
            }
            #endregion
     

    que tem a função de fazer um delock na memória.

    Basicamente isto.


    segunda-feira, 27 de maio de 2013 14:46