Solucionado (ver solução)
Solucionado
(ver solução)
13
respostas

por que preciso usar o this nesse caso?

boa tarde,

alguem poderia me explicar porque preciso usar o this nesse caso ao invés de ser assim:



        private void Form1_Load(object sender, EventArgs e)
        {
            //this.conta = new Conta();
            //this.conta.Titular = "Victor";

            Cliente c1 = new Cliente();   //assim?
            Conta c = new Conta();
            c.Titular = c1;

            c1.nome = "Taina";
            c.Numero = 1;
            c.Deposita(600);
            textoTitular.Text = c1.nome;
            textoNumero.Text = Convert.ToString(c.Numero);
            textoSaldo.Text = Convert.ToString(c.Saldo);


        }
13 respostas

Boa tarde, Taina!

Não sei qual é o exemplo do curso, mas muito provavelmente a conta está sendo armazenada como um atributo do objeto para poder ser utilizada novamente em outros eventos da tela.

nao entendi

Tainá, vou te dar exemplo com uma classe Conta pra você entender bem a função do this.

public class Conta {
    private string nome;

    public void informarNome(string nome)
    {
        this.nome = nome;
    }    
}

No meu exemplo, a propriedade da classe Conta para armazenar o nome chama nome e o parâmetro do método informarNome() também chama nome. Usando o this, eu consigo informar que, quando o compilador chegar no momento de atribuir o nome à variável, o this está referenciando a própria classe.

No seu caso, o Form1_Load() é o método que é executado ao carregar seu form que, por padrão, chama Form1. O jeito que você fez não está errado, mas do jeito do exemplo do exercício proposta, você cria o objeto na classe principal, fora do método Form1_load() e apenas instancia esse objeto caso o load do form ocorra. Por que isso? Basicamente para só alocar memória instanciando o objeto quando for necessário.

Compreende? Se criasse o método tipo Conta c = new Conta() fora do método, já estaria também instanciando ele, porém a instância só será utilizada no load (ou onde quisesse). Então por quê instanciar na classe?

Se ficar dúvidas, explico mais.

obrigada. entao instanciamos na classe para ficar visivel a todos os metodos no caso. ?

Oi Tainá.

Na verdade, o fato de você criar o objeto na classe, já ficaria visível a todos os métodos. Você não precisa instanciar na classe, entende? Você só instancia em um método, caso você vá utilizar como um novo objeto. Caso não vá utilizar em determinado método, não precisa instanciar esse objeto.

Vamos ver dois casos baseados no seu exemplo inicial:

// Exemplo 1

Conta conta;

private void Form1_Load(object sender, EventArgs e)
{
    this.conta = new Conta();
    this.conta.Titular = "Tainá";
}
// Exemplo 2

Conta conta;

private void Form1_Load(object sender, EventArgs e)
{
    Conta minhaConta = new Conta();
    minhaConta.Titular = "Tainá";
}

Nos dois exemplos acima eu crio uma conta e coloco "Tainá" como nome do titular. Note, porém, que no primeiro caso, eu uso o objeto contaque é uma variável de instância, apenas sendo necessário instanciar ele e atribuir o titular. Ou seja, agora se eu tiver mais métodos nessa classe (assim como acabamos de utilizar o método Form1_Load() ), poderei usar esse objeto conta que tem o titular "Tainá", é o mesmo objeto.

Já no segundo exemplo, nós criamos e instanciamos um objeto do tipo Conta dentro do método Form1_Load(), porém ele é uma variável de escopo, só existe dentro desse método e acaba morrendo ali, pois não utilizamos para mais nada. Ou seja, outros métodos não conseguem acessar esse objeto. No fim, ele vira lixo de memória e acaba sendo coletado pelo Garbage Collector.

solução!

Segue mais exemplos:

public class Conta {
    Cliente meuCliente;

    public Conta(string nome) {
        this.meuCliente = new Cliente();
        this.meuCliente.Nome = nome;
    }

    public string RetornaNomeCliente() {
        return this.meuCliente.Nome;
    }

    public void MudaNomeCliente(string novoNome) {
        this.meuCliente.Nome= novoNome;
    }

    public void OutroMetodoMudaNomeCliente(string novoNome) {
        Cliente meuCliente = new Cliente();
        meuCliente.Nome = novoNome;
    }
}

Tainá, considerando que você tenha aprendido o que é construtor de classe, verá que nessa classe eu tenho um construtor que pede uma string como parâmetro, onde usarei tal valor para ser o titular da conta. Agora imagine a seguinte classe do programa, utilizando a classe conta:

public class Program {
    Conta c = new Conta("Tainá");
    c.MudaNomeCliente("Xuxa");
    c.OutroMetodoMudaNomeCliente("Didi");

    Console.WriteLine("Titular: " + c.RetornaNomeCliente());
}

Me responta aqui qual será o nome retornado pelo método RetornaNomeCliente(), sem testar isso em código.

nome?

Oi.

Não era pra marcar resposta como solucionada até você entender tudo :)

Sim, o nome. Olha o método:

public string RetornaNomeCliente() {
        return this.meuCliente.Nome;
    }

Ele retorna uma string contendo o nome do cliente. Queria que você descobrisse qual seria o nome retornado no exemplo que dei.

então acertei? falei "nome" :)

bruno, tem um exemplo de uma atividade de um formulario do banco que no exercicio no corpo do formulario usa-se Conta conta.. e eu coloquei uma instância.. :S

Oi Tainá.

A resposta seria "Xuxa".

Acho que você está confundindo as coisas. Instância é quando você instancia um objeto. Por exemplo:

Conta c;

Criei a referência ao objeto, porém não o instanciei ainda, logo não consigo acessar nada dele, nenhuma propriedade nem seus métodos.

Agora:

Conta c = new Conta(); // referência e instância
Conta outraConta; // referência
outraConta = new Conta(); // agora instanciada

Nesse caso mostrei dois exemplos para instanciar objetos. Lembre-se: sem instanciar os objetos, não conseguirá acessar as propriedades e métodos do objeto, aquelas que vocês criou na classe.

Bruno,

Nao entendo porque devo referenciar a conta

Conta conta;

No curso so ensina a criar a classe e logo depois instancia-la.

Oi Janile.

Você não precisa fazer isso. Inclusive, a única forma de utilizar a referência é depois dela ter sido instanciada, ou se ela tiver recebido um outro objeto da mesma classe, ou até ser um clone. A questão é que você pode, por exemplo, ter mais de um construtor. Vamos supor que, dependendo de uma condição, você vai criar o objeto usando um ou outro construtor, como faria? Criando apenas a referência e instanciando o objeto de acordo com a condição. Exemplo:

Conta c;

if (condicao)
    c = new Conta("Parâmetro 1");
else
    c = new Conta("Parâmetro 1", "Parâmetro 2");

Entendeu? Nesse caso, você vai acabar instanciando o objeto sim, porém criei só a referência antes e instanciei de acordo com a condição. Toda vez que você utiliza o operador new uma nova instância do objeto é criada. Ou seja, um espaço de memória é separado e associado a esse objeto. Isso gera um custo, então é melhor instanciar o objeto no momento que for utilizar.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software