在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();
}}我知道它会产生以下输出:objectA.val = 20objectB.val = 20structA.val = 30structB.val = 40输出的最后两行我没有问题,但前两个告诉我objectA并objectB指向相同的内存块(因为在C#中,对象是引用类型)。问题是make如何制作objectB,objectA以便它指向内存中的不同区域。我理解,尝试分配他们的成员可能不起作用,因为这些成员也可能是参考。那么我该如何制作objectB一个完全不同的实体objectA呢?谢谢
3 回答
牧羊人nacy
TA贡献1862条经验 获得超7个赞
没有内置的方式。你可以让MyClass实现IClonable
接口(但它有点不赞成)或只是编写自己的Copy / Clone方法。在任何一种情况下,您都必须编写一些代码。
对于大对象,您可以考虑序列化+反序列化(通过MemoryStream),只是为了重用现有代码。
无论采用何种方法,都要仔细考虑“副本”的含义。它应该有多深,是否有被禁止的Id字段等。
慕的地8271018
TA贡献1796条经验 获得超4个赞
最简单的方法是在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 = 10objectB.val = 20
- 3 回答
- 0 关注
- 880 浏览
添加回答
举报
0/150
提交
取消