1
resposta

Diferença.

Qual a diferença da cópia para o Clone ?

1 resposta

Gledson,

Boa pergunta! Vamos testar? Eu adoro testar... Segue um código que eu montei rapidão para fazer comparações:

static void Main(string[] args)
{
    int i;

    string[] origem = new[] { "Posição 0", "Posição 1", "Posição 2", "Posição 3" };
    string[] destinoCopy = new string[8];
    string[] destinoClone = new string[8];

    Console.WriteLine("");
    Console.WriteLine("A ORIGEM:");
    i = 0;

    foreach (var item in origem)
    {
        Console.WriteLine("ORIGEM: " + i + " - " + item);
        i++;
    }

    Console.WriteLine("");
    Console.WriteLine("--- 1ª Diferença, veja como ficam as estruturas: ---");

    // Começou pela posição "2" (deixou a posição 0 e 1 vazias...)
    origem.CopyTo(destinoCopy, 2);

    Console.WriteLine("");
    Console.WriteLine("A Cópia simples montou um objeto deixando vazias as posições NÃO usadas.");
    i = 0;

    foreach (var item in destinoCopy)
    {
        Console.WriteLine("Cópia Simples: " + i + " - " + item);
        i++;
    }

    Console.WriteLine("");
    Console.WriteLine("O Clone customizou os tamanhos.");
    destinoClone = (string[])origem.Clone();
    i = 0;

    foreach (var item in destinoClone)
    {
        Console.WriteLine("Cópia Clone: " + i + " - " + item);
        i++;
    }

    Console.WriteLine("");
    Console.WriteLine("--- Modifiquei a ORIGEM para ver se impacta nos destinos... ---");
    Console.WriteLine("--- Modifiquei também posições diferentes nos destinos ---");

    origem.SetValue("Posição origem", 0);
    destinoCopy.SetValue("Posição copy", 3);
    destinoClone.SetValue("Posição clone", 2);

    Console.WriteLine("");
    Console.WriteLine("A ORIGEM.");
    i = 0;

    foreach (var item in origem)
    {
        Console.WriteLine("Cópia Simples: " + i + " - " + item);
        i++;
    }

    Console.WriteLine("");
    Console.WriteLine("A Cópia simples.");
    i = 0;

    foreach (var item in destinoCopy)
    {
        Console.WriteLine("Cópia Simples: " + i + " - " + item);
        i++;
    }

    Console.WriteLine("");
    Console.WriteLine("O Clone.");
    i = 0;

    foreach (var item in destinoClone)
    {
        Console.WriteLine("Cópia Clone: " + i + " - " + item);
        i++;
    }

    Console.WriteLine("");
    Console.WriteLine("--- Não impactou em nenhum dos dois casos... foi copiado o valor, não o endereço de memória. ---");

    Console.ReadKey();
}

Parece que o "Copy" copia e mantem a estrutura do objeto destino e o clone "adapta" o tamanho do objeto destino para igualar a do objeto original.

Leia também:

==========================================================

Copying and Cloning Arrays in C#

by Peter Mbanugo

March 05, 2019

https://www.telerik.com/blogs/copying-and-cloning-arrays-in-c

==========================================================

Array.Clone() (Copy or not?)

https://stackoverflow.com/questions/21536212/array-clone-copy-or-not

==========================================================

[]'s,

Fabio I.