none
Como atribuir uma cópia de um objeto á outro, e não o mesmo endereço de memória RRS feed

  • Pergunta

  • Ao atribuir um valor á um objeto e atribuir o mesmo valor á outro ex:

    ClasseExemplo objetoExemplo = ClasseX.ClasseExemplo; ClasseExemplo objetoExemplo2 = objetoExemplo;

    objetoExemplo2 = objetoY.GerarExemplo();

    //objetoExemplo será igual á ClasseX.ClasseExemplo ou objetoY.GerarExemplo()?


    O segundo objeto passa a apontar para o mesmo endereço de memória, assim quando alterado o primeiro também é, gostaria de atribuir ao segundo apenas o mesmo valor , fazendo com que seja outro objeto independente. 

    Outra duvida, quando um objeto e passado como parametro  em uma função, é passada uma copia do valor ou o mesmo endereço de memória, ou seja no exemplo a seguir qual será o valor do x?

     
    public class Exemplo
    {
    
        FuncaoAlterarValor(int valor)
        {
           valor = valor + 5;
        }
    }
    
    public static void main(string[] args)
    {
        int x = 5;
        FuncaoAlterarValor(x);
        // x = 5 ou igual á 10
    }
    sei que é fácil compilar esses exemplos e ver o resultado porém gostaria de entender como  o c# trata a locação de memória e se seria uma peculiaridade apenas la linguagem  

    Leonardo de Freitas Oliveira

    quarta-feira, 15 de janeiro de 2014 14:09

Todas as Respostas

  • Defoliveira

    No primeiro caso creio que bastaria você fazer o seguinte:

    Crio dois objetos separados:

    ClasseExemplo varExemplo1 = new ClasseExemplo();

    ClasseExemplo varExemplo2 = new ClasseExemplo();

    e para passar os valores de um para o outro basta:

    varExemplo1.x = varExemplo2.x

    (foi o que entendi da sua pergunta)

    No segundo caso:

    public class Exemplo { FuncaoAlterarValor(int valor) { valor = valor + 5; } } public static void main(string[] args) { int x = 5; FuncaoAlterarValor(x); // x = 5 ou igual á 10 }


    O x continuaria tendo o valor 5. pois você chamou a função de calculo mas não atribuiu o valor. Para que o valor pudesse ser mudado você faria algo assim:

    public class Exemplo
    {
    
        FuncaoAlterarValor(int valor)
        {
           valor = valor + 5;
        }
    }
    
    public static void main(string[] args)
    {
        int x = 5;
        x = FuncaoAlterarValor(x);
       //ai sim o valor mudaria
    }

    Espero poder ter ajudado

    abraço

    quarta-feira, 15 de janeiro de 2014 15:32
  • Olá no primeiro caso por ex :

    Class1 c = new Class();
    
    Class1 d = c;
    
    Class1 e = d;
    
    

    Todos os três objetos terá o mesmo valor ou seja a mesma referencia, e alterar o valor de um deles reflete em todos. Pq a referencia para o objeto na memoria vai apontar para o mesmo local. 

    Olhe este thread que explica isso que deseja e essas imagens.

    No segundo caso vai retornar 10, pq seu parametro vem inicializado. Existe outros tipos de declarar este parametro que se chama ref e out aconselho dar uma olhada pq explica exatamente isso que perguntou.

    quarta-feira, 15 de janeiro de 2014 15:54
  • Depende do tipo de dados.

    Se for uma classe, sempre será por referencia, até em funções.

    Se for tipos primitivos será por valor, a não ser que na função se especifique por referencia com ref, ou out como foi falado.

    Respondendo as suas duas questões:

    1 -> objetoExemplo será igual a ClasseX.ClasseExemplo

    2-> Valor será 5, pois feito copia.

    Com classes não existe como fazer cópia, o que se faz para ter uma cópia é implementar a interface ICloneable e instanciar um novo objeto e copiar as informações para o novo objeto.

    quarta-feira, 15 de janeiro de 2014 16:31
  • Leonardo boa tarde,

    Acredito que a maneira mais elegante de resolver isso é implemetar a interface ICloneable, onde você vai implementar o método Clone em sua classe  

        public class Pessoa : ICloneable
        {
            
            public string Nome { get; set; }
            public string Endereco { get; set; }
    
            public object Clone()
            {
                return new Pessoa(this.Nome, this.Endereco);
            }
    
            public Pessoa()
            {
                
            }
    
            public Pessoa(string nome,string endereco)
            {
                this.Nome = nome;
                this.Endereco = endereco;
            }
    
        }

            static void Main(string[] args)
            {
               Pessoa P1 = new Pessoa("Diego","Rua TAL");
    
               Pessoa p2 = (Pessoa)P1.Clone();
    
                p2.Nome = "TESTE";
    
                Console.WriteLine("p1=" + P1.Nome);
                Console.WriteLine("p2=" + p2.Nome);
                Console.ReadKey();
    
            }

    Espero ter ajudado!



    Somente Analista de Sistema e Traficante tem usuário

    quarta-feira, 15 de janeiro de 2014 16:42