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