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

Estou com dúvida no curso de C# e Tópicos Avançados, no exercício do capítulo Mão na Massa - Formulários.

Não faço ideia de como resolver esse exercício alterando apenas o método AdicionaConta da classe Form1

    public void AdicionaConta(Conta conta)
    {
        this.contas[this.quantidadeDeContas] = conta;
        this.quantidadeDeContas++;
        comboContas.Items.Add(conta);
    }
5 respostas
solução!

Olá Marcelo

Nesse exercício precisamos recriar o array quando ele fica cheio. Para isso, dentro do método AdicionaConta, sabemos que o array está cheio quando a quantidadeDeContas é igual ao tamanho do array:

if(quantidadeDeContas == contas.Length)
{
   // precisamos dar um jeito de fazer o array crescer...
}

Dentro do if precisamos aumentar a capacidade do array, mas como o array possui um tamanho imutável, precisamos criar um novo array com uma capacidade maior do que a antiga, o dobro da capacidade, por exemplo:

if(quantidadeDeContas == contas.Length)
{
   new Conta[contas.Length * 2];
}

Porém não podemos guardar esse novo array diretamente no atributo contas pois com isso perderemos as contas que já foram cadastradas.

if(quantidadeDeContas == contas.Length)
{
   Conta[] temporario = new Conta[contas.Length * 2];
}

Agora precisamos copiar o conteúdo do array antigo para o array novo:

if(quantidadeDeContas == contas.Length)
{
   Conta[] temporario = new Conta[contas.Length * 2];
   for(int i = 0; i < this.contas.Length; i++)
   {
      temporario[i] = this.contas[i];
   }
}

E agora sim podemos colocar o novo array no atributo contas:

this.contas = temporario;

Depois disso, o resto do código fica igual ao que você postou. O código final do método fica da seguinte forma:

public void AdicionaConta(Conta conta)
{
  if(quantidadeDeContas == contas.Length)
  {
    Conta[] temporario = new Conta[contas.Length * 2];
    for(int i = 0; i < this.contas.Length; i++)
    {
      temporario[i] = this.contas[i];
    }
    this.contas = temporario;
  }
  this.contas[this.quantidadeDeContas] = conta;
  this.quantidadeDeContas++;
  comboContas.Items.Add(conta);
}

Marcelo seria interessante você fazer o curso básico de C# para poder melhorar sua base, um abraço!

Olá Marcelo

A sua dúvida foi resolvida?

Obrigado! A minha foi resolvida! :)

Olá Vitor, teu a forma que voce explicou aqui foi muito perceptivel, obrigado.

Porém estou com o mesmo erro que tinha antes e nao entendo o porque e já criei outro post sobre o assunto e ainda nao solucionei. Se puder ajudar me, agradeco.

Antes estava com erro aqui: 

this.contas[this.quantidadeDeContas] = conta;

E depois de acrescentar este código, o erro passou a ser aqui:

if (this.quantidadeDeContas == this.contas.Length)

msg de erro:
An unhandled exception of type 'System.NullReferenceException' occurred in CaixaEletronico2.exe

se passo o cursor por cima de 'this.contas' diz que é null e em thi.quantidadeDeContas diz 0

Obrigado pelo apoio :)