Создание копии объекта в C# [дубликат]




Возможные Дубликаты:
как вы делаете глубокую копию объекта в .Net (в частности, C#)?






пожалуйста, взгляните на код ниже (отрывок из книги C#):



namespace Example {
class MyClass {
public int val;
}

struct myStruct {
public int val;
}

class Program {
static void Main(string[] args) {
MyClass objectA = new MyClass();
MyClass objectB = objectA;
objectA.val = 10;
objectB.val = 20;
myStruct structA = new myStruct();
myStruct structB = structA;
structA.val = 30;
structB.val = 40;
Console.WriteLine("objectA.val = {0}", objectA.val);
Console.WriteLine("objectB.val = {0}", objectB.val);
Console.WriteLine("structA.val = {0}", structA.val);
Console.WriteLine("structB.val = {0}", structB.val);
Console.ReadKey();
}
}
}


Я понимаю, что он производит вывод ниже



objectA.val = 20
objectB.val = 20
structA.val = 30
structB.val = 40


последние две строки вывода у меня нет проблем, но первые две говорят мне, что objectA и objectB указывают на тот же блок памяти (так как в C#, объекты являются ссылочными типами).



вопрос в том, как сделать objectB, копия objectA Так, что он указывает на другую область памяти. Я понимаю, что попытка назначить своих членов может не сработать, так как эти члены могут быть ссылками. Так как же мне сделать objectB совершенно другой объект от objectA?



спасибо

2359   4  

4 ответов:

нет встроенного способа. Вы можете иметь MyClass реализовать IClonable интерфейс (но это своего рода устаревший) или просто написать свой собственный метод копирования/клонирования. В любом случае вам придется написать некоторый код.

для больших объектов можно рассмотреть сериализацию + десериализацию (через MemoryStream), просто для повторного использования существующего кода.

каким бы ни был метод, тщательно подумайте о том, что именно означает "копия". Как глубоко он должен идти, есть ли поля Id, чтобы быть освобожденные и т. д.

вы могли бы сделать:

class myClass : ICloneable
{
    public String test;
    public object Clone()
    {
        return this.MemberwiseClone();
    }
}

затем вы можете сделать

myClass a = new myClass();
myClass b = (myClass)a.Clone();

Б. Н.MemberwiseClone() создает неглубокую копию текущей системы.Объект.

самый простой способ сделать это-написать конструктор копирования в классе MyClass.

что-то вроде этого:

namespace Example
{
    class MyClass
    {
        public int val;

        public MyClass()
        {
        }

        public MyClass(MyClass other)
        {
            val = other.val;
        }
    }
}

второй конструктор просто принимает параметр своего типа (тот, который вы хотите скопировать) и создает новый объект с тем же значением

class Program
{
    static void Main(string[] args)
    {
        MyClass objectA = new MyClass();
        MyClass objectB = new MyClass(objectA);
        objectA.val = 10;
        objectB.val = 20;
        Console.WriteLine("objectA.val = {0}", objectA.val);
        Console.WriteLine("objectB.val = {0}", objectB.val);
        Console.ReadKey();
    }
}

выход:

objectA.val = 10

objectB.val = 20               

уже есть вопрос об этом, вы могли бы прочитать его

объекты глубокого клонирования

нет метода Clone (), как он существует, например, в Java, но вы можете включить конструктор копирования в свои clases, это еще один хороший подход.

class A
{
  private int attr

  public int Attr
  {
     get { return attr; }
     set { attr = value }
  }

  public A()
  {
  }

  public A(A p)
  {
     this.attr = p.Attr;
  }  
}

Это был бы пример копирования члена 'Attr' при построении нового объекта.

Comments

    Ничего не найдено.