İngilizce dilinde oku

Aracılığıyla paylaş


Object.MemberwiseClone Yöntem

Tanım

Geçerli Objectbasit bir kopyasını oluşturur.

C#
protected object MemberwiseClone();

Döndürülenler

Geçerli Objectbasit bir kopyası.

Örnekler

Aşağıdaki örnekte MemberwiseClone yöntemi gösterilmektedir. bir Person nesnesi üzerinde basit bir kopyalama işlemi gerçekleştirmek için MemberwiseClone yöntemini çağıran bir ShallowCopy yöntemi tanımlar. Ayrıca bir Person nesnesi üzerinde derin kopyalama işlemi gerçekleştiren bir DeepCopy yöntemi tanımlar.

C#
using System;

public class IdInfo
{
    public int IdNumber;

    public IdInfo(int IdNumber)
    {
        this.IdNumber = IdNumber;
    }
}

public class Person
{
    public int Age;
    public string Name;
    public IdInfo IdInfo;

    public Person ShallowCopy()
    {
        return (Person)MemberwiseClone();
    }

    public Person DeepCopy()
    {
        Person other = (Person)MemberwiseClone();
        other.IdInfo = new IdInfo(IdInfo.IdNumber);
        return other;
    }
}

public class Example
{
    public static void Main()
    {
        // Create an instance of Person and assign values to its fields.
        Person p1 = new()
        {
            Age = 42,
            Name = "Sam",
            IdInfo = new IdInfo(6565)
        };

        // Perform a shallow copy of p1 and assign it to p2.
        Person p2 = p1.ShallowCopy();

        // Display values of p1, p2
        Console.WriteLine("Original values of p1 and p2:");
        Console.WriteLine("   p1 instance values: ");
        DisplayValues(p1);
        Console.WriteLine("   p2 instance values:");
        DisplayValues(p2);

        // Change the value of p1 properties and display the values of p1 and p2.
        p1.Age = 32;
        p1.Name = "Frank";
        p1.IdInfo.IdNumber = 7878;
        Console.WriteLine("\nValues of p1 and p2 after changes to p1:");
        Console.WriteLine("   p1 instance values: ");
        DisplayValues(p1);
        Console.WriteLine("   p2 instance values:");
        DisplayValues(p2);

        // Make a deep copy of p1 and assign it to p3.
        Person p3 = p1.DeepCopy();
        // Change the members of the p1 class to new values to show the deep copy.
        p1.Age = 39;
        p1.Name = "George";
        p1.IdInfo.IdNumber = 8641;
        Console.WriteLine("\nValues of p1 and p3 after changes to p1:");
        Console.WriteLine("   p1 instance values: ");
        DisplayValues(p1);
        Console.WriteLine("   p3 instance values:");
        DisplayValues(p3);
    }

    public static void DisplayValues(Person p)
    {
        Console.WriteLine($"      Name: {p.Name:s}, Age: {p.Age:d}");
        Console.WriteLine($"      Value: {p.IdInfo.IdNumber:d}");
    }
}

/* The example displays the following output:
 * 
 * Original values of p1 and p2:
      p1 instance values:
         Name: Sam, Age: 42
         Value: 6565
      p2 instance values:
         Name: Sam, Age: 42
         Value: 6565

   Values of p1 and p2 after changes to p1:
      p1 instance values:
         Name: Frank, Age: 32
         Value: 7878
      p2 instance values:
         Name: Sam, Age: 42
         Value: 7878

   Values of p1 and p3 after changes to p1:
      p1 instance values:
         Name: George, Age: 39
         Value: 8641
      p3 instance values:
         Name: Frank, Age: 32
         Value: 7878
 */

Bu örnekte, Person.IdInfo özelliği bir IdInfo nesnesi döndürür. Örnekteki çıktıda gösterildiği gibi, bir Person nesnesi MemberwiseClone yöntemi çağrılarak kopyalandığında, kopyalanan Person nesnesi, aynı Person.IdInfo nesne başvurularını paylaşmaları dışında özgün nesnenin bağımsız bir kopyasıdır. Sonuç olarak, kopyanın Person.IdInfo özelliğinin değiştirilmesi özgün nesnenin Person.IdInfo özelliğini değiştirir. Öte yandan, bir derin kopyalama işlemi gerçekleştirildiğinde, kopyalanan Person nesnesi, Person.IdInfo özelliği de dahil olmak üzere özgün nesne etkilenmeden değiştirilebilir.

Açıklamalar

MemberwiseClone yöntemi, yeni bir nesne oluşturup geçerli nesnenin statik olmayan alanlarını yeni nesneye kopyalayarak sığ bir kopya oluşturur. Alan bir değer türüyse, alanın bit bit kopyası gerçekleştirilir. Bir alan bir başvuru türüyse, başvuru kopyalanır ancak başvuruda bulunılan nesne kopyalanmaz; bu nedenle, özgün nesne ve kopyası aynı nesneye başvurur.

Sığ ve derin kopyalama işlemi arasındaki farkı göstermek için, A ve B nesnelerine başvuran X adlı bir nesne düşünün. B nesnesi de C nesnesine başvurur. X'in sığ bir kopyası, A ve B nesnelerine de başvuran yeni bir X2 nesnesi oluşturur. Buna karşılık, X'in derin bir kopyası, A ve B2'nin kopyaları olan yeni A2 ve B2 nesnelerine başvuran yeni bir X2 nesnesi oluşturur. B2, C'nin bir kopyası olan yeni C2 nesnesine başvurur.

MemberwiseClone yöntemi tarafından gerçekleştirilen sığ kopyalama işlemi gereksinimlerinizi karşılamıyorsa, derin kopyalama işlemini uygulamanın birçok yolu vardır. Bunlar şunları içerir:

  • kopyalanacak nesnenin sınıf oluşturucusunu çağırarak ilk nesneden alınan özellik değerlerine sahip ikinci bir nesne oluşturun. Bu, bir nesnenin değerlerinin tamamen kendi sınıf oluşturucusunun tanımladığını varsayar.
  • Bir nesnenin sığ bir kopyasını oluşturmak için MemberwiseClone yöntemini çağırın ve sonra değerleri özgün nesneyle aynı olan yeni nesneleri, değerleri başvuru türü olan tüm özelliklere veya alanlara atayın. Örnekteki DeepCopy yöntemi bu yaklaşımı gösterir.
  • Derin kopyalanacak nesneyi seri hale getirin ve serileştirilmiş verileri farklı bir nesne değişkenine geri yükleyin.
  • Derin kopyalama işlemini gerçekleştirmek için özyinelemeli yansıma kullanın.

Şunlara uygulanır

Ürün Sürümler
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0