Copia superficial y copia profunda en C#

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;
    }
}
Producción:

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;
    }
}
}
Producción:

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *