1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Problema/erro em C#

Discussão em 'Programação' iniciada por No F3aR, 1 de Junho de 2008. (Respostas: 3; Visualizações: 734)

  1. No F3aR

    No F3aR Power Member

    Boas, estou com um ligeiro problema numa estrutura do tipo List<>. Será que me podem ajudar?

    O codigo é o seguinte:

    Código:
    class manipulacaoReclamacoes
        {
            private string descricao;
            private string nomeAvatar;
            private string idAvatar
            private string data;
            private string nomeProduto;
    
            List<manipulacaoReclamacoes> lista = new List<manipulacaoReclamacoes> ();
            manipulacaoReclamacoes objt;
    ....
    
            public void preencheLista(ArrayList mensagens )
            {
                if(objt ==null)
                    objt = new manipulacaoReclamacoes();
         
                foreach (string msg in mensagens)
                {
                    int index = msg.IndexOf("\r\n\r\n");
    
                    string str = msg.Substring(index);
                    str = str.Trim();
                    string[] str1 = str.Split(';');
    
                    objt.descricao = str1[0];
                    objt.nomeAvatar = str1[1];
                    objt.idAvatar = str1[2];
                    objt.data = str1[3];
                    objt.nomeProduto = str1[4];
    
                    lista.Add(objt); 
                }
    Ora bem, a função preencheLista recebe um ArrayList que contem mensagens de email. A seguir no foreach cada mensagem de email vai ser separada e tratada, atraves da função Split, para assim retirar os campos que interessam de cada mensagem de email.
    Cada instancia da classe assume o valor do campo do email separado pela função Split, no final o objecto objt com cada instancia preenchida, é adicionado ao fim da lista (lista.Add).

    Agora, supondo que o ArrayList continha tres mensagens de email, a List deveria ter 3 objectos diferentes do tipo manipulacaoReclamacoes, ou seja, 3 "descricao" diferente, 3 nomeProduto diferente, etc..

    O problema é que quando vizualizo o conteudo da List, constato que ela contem 3 objectos iguais, ou seja, por exemplo: apresenta-me 3 vezes o conteudo do ultimo objecto objt que lhe foi adicionado. (ou melhor, apresenta-me 3 vezes cada instancia da classe, mas com o valor do ultimo objt adicionado (List.Add)).

    Será que me podem ajudar? :confused:

    Obrigado a todos
     
    Última edição pelo moderador: 5 de Junho de 2008
  2. Quaker

    Quaker Power Member

    Bem se a lista tem 3 objectos tudo com a ultima string que lhe mandas-te é pk não está a criar 3 objectos diferentes... Mas estás a actualizar referências que apontam para o mesmo objecto... Não sei se me fiz explicar... ou seja não existem 3 objectos mas apenas 1 e a lista tem 3 ponteiros para esse objecto... Verifica que se quando envias a string estás realmente a criar um novo objecto e quando estás a adicionar esse novo objecto o que está a entrar na lista é o correcto... e Já agora um arrayList não é o mesmo que uma List existe um método na list que passa uma lista para vector...

    Código:
             
    List<manipulacaoReclamacoes> lista = new List<manipulacaoReclamacoes> ();
            manipulacaoReclamacoes objt;
    ....
    
            public void preencheLista(ArrayList mensagens )
    
     
  3. SoundSurfer

    SoundSurfer Power Member

    Essa classe está bastante "manhosa", mas continuando:

    O erro está aqui:

    manipulacaoReclamacoes objt;

    e aqui:

    if(objt ==null)
    objt = new manipulacaoReclamacoes();

    Ou seja.. estás sempre a colocar a alterar e a colocar o mesmo objecto dentro da lista... o que a lista guarda é a referência do objecto.. se o modificares a seguir, mudas sempre o mesmo objecto...

    Solução.

    Apagas esta linha: manipulacaoReclamacoes objt;

    e em vez disto:

    if(objt ==null)
    objt = new manipulacaoReclamacoes();

    colocas isto:

    manipulacaoReclamacoes objt = new manipulacaoReclamacoes();
     
    Última edição: 2 de Junho de 2008
  4. No F3aR

    No F3aR Power Member

    Obrigado aos dois, depois de me terem falado em Referencias, tive uma luzinha, pesquisei e descobri qual o problema. Esse mesmo, a lista apenas guarda referencias para o objecto, e como o objecto é sempre o mesmo.

    Mas so uma ultima pergunta,
    Porque achas que a classe está "manhosa"?
     

Partilhar esta Página