Создание копии объекта в 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 чтобы он objectA на другую область в памяти. Я понимаю, что попытки назначить своих членов могут не работать, поскольку эти члены также могут быть ссылками. Итак, как я могу сделать objectB совершенно другим объектом из objectA ?

благодаря

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

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

Каким бы ни был метод, тщательно подумайте о том, что означает «копия». Как глубоко он должен идти, есть ли поля Идентификатора, которые будут исключены и т. Д.

Вы можете сделать:

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

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

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

NB MemberwiseClone() Создает неглубокую копию текущего объекта System.Object.

Самый простой способ сделать это – написать конструктор копирования в classе 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, например, но вы можете включить конструктор копирования в свои кланы, это еще один хороший подход.

 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» при создании нового объекта.

  • OpenCV C ++ / Obj-C: расширенное определение квадратов
  • Makefile для размещения объектных файлов из исходных файлов разных каталогов в один отдельный каталог?
  • Наследование в Java и суперclassах (объект, class)
  • Есть ли Java XML API, который может анализировать документ без разрешения объектов символов?
  • make arrayList.toArray () возвращает более конкретные типы
  • Почему каждый объект в Java неявно расширяет class java.lang.Object?
  • Что на самом деле делает «новое» ключевое слово на Java, и не следует ли мне создавать новые объекты?
  • Кастинг объектов в Java
  • Как сгруппировать массив объектов по ключу
  • Преобразовать вложенный Python dict в объект?
  • Что такое сериализация объектов?
  • Давайте будем гением компьютера.