En general, cuando tratamos de copiar un objeto a otro objeto, ambos objetos compartirán la misma dirección de memoria. Normalmente, usamos el operador de asignación, = , para copiar la referencia, no el objeto, excepto cuando hay un campo de tipo de valor . Este operador siempre copiará la referencia, no el objeto real. Por ejemplo: supongamos que G1 se refiere a la dirección de memoria 5000 , luego G2 también se referirá a 5000. Entonces, si uno cambia el valor de los datos almacenados en la dirección 5000 , tanto G1 como G2 mostrarán los mismos datos.
Geeks G1 = new Geeks(); // Copy the instance using // '=' operator Geeks G2 = G1;
Copia superficial: crear un nuevo objeto y luego copiar los campos de tipo de valor del objeto actual al nuevo objeto. Pero cuando los datos son de tipo de referencia , se copia la única referencia, pero no el objeto referido en sí. Por lo tanto, el original y el clon se refieren al mismo objeto. El concepto será más claro cuando vea el código y el diagrama de la copia superficial.
Nota: En el diagrama anterior , el campo de tipo de valorGlobal Rank
es , por lo que crea la copia de eso y lo almacena en una ubicación diferente, pero el campo de tipo Nombre es Referencia , por lo que apunta a la ubicación de memoria principal o antigua.(Desc)
Ejemplo: aquí, si cambiará el tipo de valor, entonces está funcionando en c2 y c1, y no se ve afectado, pero en el tipo de referencia, cualquier cambio afectará tanto a c1 como a c2.
// C# program to illustrate the // concept of Shallow Copy using System; class Example { // Main Method static void Main(string[] args) { Company c1 = new Company(548, "GeeksforGeeks", "Sandeep Jain"); // Performing Shallow copy Company c2 = (Company)c1.Shallowcopy(); Console.WriteLine("Before Changing: "); // Before changing the value of // c2 GBRank and CompanyName Console.WriteLine(c1.GBRank); Console.WriteLine(c2.GBRank); Console.WriteLine(c2.desc.CompanyName); Console.WriteLine(c1.desc.CompanyName); // changing the value of c2 GBRank // and CompanyName c2.GBRank = 59; c2.desc.CompanyName = "GFG"; Console.WriteLine("\nAfter Changing: "); // After changing the value of // c2 GBRank and CompanyName Console.WriteLine(c1.GBRank); Console.WriteLine(c2.GBRank); Console.WriteLine(c2.desc.CompanyName); Console.WriteLine(c1.desc.CompanyName); } } class Company { public int GBRank; public CompanyDescription desc; public Company(int gbRank, string c, string o) { this.GBRank = gbRank; desc = new CompanyDescription(c, o); } // method for cloning object public object Shallowcopy() { return this.MemberwiseClone(); } // method for cloning object public Company DeepCopy() { Company deepcopyCompany = new Company(this.GBRank, desc.CompanyName, desc.Owner); return deepcopyCompany; } } class CompanyDescription { public string CompanyName; public string Owner; public CompanyDescription(string c, string o) { this.CompanyName = c; this.Owner = o; } }
Before Changing: 548 548 GeeksforGeeks GeeksforGeeks After Changing: 548 59 GFG GFG
Copia profunda: es un proceso de creación de un nuevo objeto y luego copiar los campos del objeto actual al objeto recién creado para hacer una copia completa de los tipos de referencia internos. Si el campo especificado es un tipo de valor, se realizará una copia bit a bit del campo. Si el campo especificado es un tipo de referencia, se realiza una nueva copia del objeto referido.
Nota: En el diagrama anterior The Global Rank
, el campo de tipo de valor crea una copia y la almacena en una ubicación diferente. El Nombre ( Desc
) es un campo de tipo Referencia , por lo que en Deep Copy hay un clon del campo de tipo referencia que también se almacenará en una ubicación diferente.
Ejemplo: aquí, el tipo de campo no importa si es tipo de valor o tipo de referencia . La copia profunda hace una copia de los datos completos y los almacena en una ubicación de memoria diferente, por lo que si cambiamos c2, c1 no se verá afectado viceversa también.
// C# program to demonstrate the // concept of Deep copy using System; namespace ShallowVSDeepCopy { class Program { // Main Method static void Main(string[] args) { Company c1 = new Company(548, "GeeksforGeeks", "Sandeep Jain"); // Performing Deep copy Company c2 = (Company)c1.DeepCopy(); Console.WriteLine("Before Changing: "); // Before changing the value of // c2 GBRank and CompanyName Console.WriteLine(c1.GBRank); Console.WriteLine(c2.GBRank); Console.WriteLine(c2.desc.CompanyName); Console.WriteLine(c1.desc.CompanyName); Console.WriteLine("\nAfter Changing: "); // changing the value of c2 // GBRank and CompanyName c2.GBRank = 59; c2.desc.CompanyName = "GFG"; // After changing the value of // c2 GBRank and CompanyName Console.WriteLine(c1.GBRank); Console.WriteLine(c2.GBRank); Console.WriteLine(c2.desc.CompanyName); Console.WriteLine(c1.desc.CompanyName); } } class Company { public int GBRank; public CompanyDescription desc; public Company(int gbRank, string c, string o) { this.GBRank = gbRank; desc = new CompanyDescription(c, o); } // method for cloning object public object Shallowcopy() { return this.MemberwiseClone(); } // method for cloning object public Company DeepCopy() { Company deepcopyCompany = new Company(this.GBRank, desc.CompanyName, desc.Owner); return deepcopyCompany; } } class CompanyDescription { public string CompanyName; public string Owner; public CompanyDescription(string c, string o) { this.CompanyName = c; this.Owner = o; } } }
Before Changing: 548 548 GeeksforGeeks GeeksforGeeks After Changing: 548 59 GFG GeeksforGeeks
Publicación traducida automáticamente
Artículo escrito por Sabya_Samadder y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA