Qual a diferença da cópia para o Clone ?
Qual a diferença da cópia para o Clone ?
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.