afa*_*lek 150 c# reference object cloning
可能重复:
如何在.Net(特别是C#)中深层复制对象?
请看下面的代码(摘自C#书):
public class MyClass
{
public int val;
}
public struct myStruct
{
public int val;
}
public class Program
{
private 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();
}
}
Run Code Online (Sandbox Code Playgroud)
我知道它会产生下面的输出
objectA.val = 20
objectB.val = 20
structA.val = 30
structB.val = 40
Run Code Online (Sandbox Code Playgroud)
输出的最后两行我没有问题,但前两个告诉我objectA并objectB指向相同的内存块(因为在C#中,对象是引用类型).
问题是make如何制作objectB,objectA以便它指向内存中的不同区域.我理解,尝试分配他们的成员可能不起作用,因为这些成员也可能是参考.那么我该如何制作objectB一个完全不同的实体objectA呢?
谢谢
Bug*_*der 129
你可以这样做:
class myClass : ICloneable
{
public String test;
public object Clone()
{
return this.MemberwiseClone();
}
}
Run Code Online (Sandbox Code Playgroud)
那么你可以做到
myClass a = new myClass();
myClass b = (myClass)a.Clone();
Run Code Online (Sandbox Code Playgroud)
NB MemberwiseClone()创建当前System.Object的浅表副本.
Hen*_*man 103
没有内置的方式.你可以让MyClass实现IClonable接口(但它有点不赞成)或只是编写自己的Copy/Clone方法.在任何一种情况下,您都必须编写一些代码.
对于大对象,您可以考虑序列化+反序列化(通过MemoryStream),只是为了重用现有代码.
无论采用何种方法,都要仔细考虑"副本"的含义.它应该有多深,是否有被禁止的Id字段等.
小智 46
最简单的方法是在MyClass类中编写一个复制构造函数.
像这样的东西:
namespace Example
{
class MyClass
{
public int val;
public MyClass()
{
}
public MyClass(MyClass other)
{
val = other.val;
}
}
}
Run Code Online (Sandbox Code Playgroud)
第二个构造函数只接受他自己类型的参数(您要复制的参数)并创建一个分配了相同值的新对象
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();
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
objectA.val = 10
objectB.val = 20
Run Code Online (Sandbox Code Playgroud)
关于这个问题已经有了问题,你或许可以阅读它
例如,Java中没有Clone()方法,但你可以在你的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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个例子,在构建新对象时复制成员'Attr'.
| 归档时间: |
|
| 查看次数: |
549369 次 |
| 最近记录: |