Создание копии объекта в 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 ?

благодаря

4 Solutions collect form web for “Создание копии объекта в C #”

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

  • make arrayList.toArray () возвращает более конкретные типы
  • Есть ли Java XML API, который может анализировать документ без разрешения объектов символов?
  • Преобразовать вложенный Python dict в объект?
  • Как я могу получить местоположение памяти объекта в java?
  • Почему каждый объект в Java неявно расширяет class java.lang.Object?
  • Создание каталогов с использованием файла make
  • Как создать объект, который выводит список (не таблица)
  • ViewParam vs @ManagedProperty (значение = "# {param.id}")
  • Как сравнить два java-объекта
  • Сравните два объекта с операторами .equals () и ==
  • Дублирование объектов в Java
  • Interesting Posts

    Добавление уравнения регрессионной линии и R2 на графике

    Java вычисляет шестнадцатеричное представление SHA-1 дайджеста строки

    Как вы можете автоматически запускать скрипт после подключения к VPN на OS X?

    Обновлять материализованное представление автоматически с помощью правила или уведомлять

    T4 без Visual Studio?

    Являются ли словари упорядоченными в Python 3.6+?

    Использование дженериков в репозиториях Spring Data JPA

    Не удается получить доступ к избранным веб-сайтам в Linux (но может быть в Windows)

    «Ручная резьба» в Thunderbird?

    Динамическое создание или ссылка переменных в Sass

    Соображения об установке Windows 8 и Ubuntu бок о бок

    Получение и удаление первого символа строки

    Как преобразовать номер столбца (например, 127) в столбец excel (например, AA)

    Как выбрать режим шифрования AES (CBC ECB CTR OCB CFB)?

    Почему конструктор по умолчанию требуется в родительском classе, если он имеет аргумент-редактор?

    Давайте будем гением компьютера.