猿问
下载APP

在C#中创建对象的副本

在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

输出的最后两行我没有问题,但前两个告诉我objectAobjectB指向相同的内存块(因为在C#中,对象是引用类型)。

问题是make如何制作objectBobjectA以便它指向内存中的不同区域。我理解,尝试分配他们的成员可能不起作用,因为这些成员也可能是参考。那么我该如何制作objectB一个完全不同的实体objectA呢?

谢谢


富国沪深
浏览 64回答 3
3回答

牧羊人nacy

没有内置的方式。你可以让MyClass实现IClonable接口(但它有点不赞成)或只是编写自己的Copy / Clone方法。在任何一种情况下,您都必须编写一些代码。对于大对象,您可以考虑序列化+反序列化(通过MemoryStream),只是为了重用现有代码。无论采用何种方法,都要仔细考虑“副本”的含义。它应该有多深,是否有被禁止的Id字段等。

MM们

你可以这样做: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的浅表副本。

慕的地8271018

最简单的方法是在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
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答