IT

C #에서 개체의 복사본 만들기

lottoking 2020. 6. 15. 08:03
반응형

C #에서 개체의 복사본 만들기 [중복]


가능한 중복 :
.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();
    }
}

아래 출력이 생성된다는 것을 이해합니다.

objectA.val = 20
objectB.val = 20
structA.val = 30
structB.val = 40

나는 아무 문제가없는 출력하지만, 처음 두의 마지막 두 줄은 나에게 그런 말 objectAobjectB(객체 참조 종류 C #에서 이후) 같은 메모리 블록을 가리키는된다.

문제는 메모리의 다른 영역을 가리 키도록 objectB사본을 만드는 방법 objectA입니다. 본인의 회원을 지명하려고하면 해당 회원도 참고인이 될 수 있으므로 회원을 지정하려고 시도하는 것이 효과가 없음을 이해합니다. 어떻게 objectB완전히 다른 엔티티를 만들 수 objectA있습니까?

감사


내장 된 방법이 없습니다. MyClass가 IClonable인터페이스를 구현하도록 할 수 있지만 (더 이상 사용되지 않음) 고유 한 Copy / Clone 메서드를 작성하면됩니다. 두 경우 모두 코드를 작성해야합니다.

큰 객체의 경우 기존 코드를 재사용하기 위해 MemoryStream을 통한 Serialization + Deserialization을 고려할 수 있습니다.

방법이 무엇이든, "사본"이 정확히 무엇을 의미하는지 신중하게 생각하십시오. 얼마나 깊어 야하고, 제외해야 할 ID 필드가 있습니까?


당신은 할 수 있습니다 :

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의 단순 복사본을 만듭니다.


가장 쉬운 방법은 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               

There's already a question about this, you could perhaps read it

Deep cloning objects

There's no Clone() method as it exists in Java for example, but you could include a copy constructor in your clases, that's another good approach.

class A
{
  private int attr

  public int Attr
  {
     get { return attr; }
     set { attr = value }
  }

  public A()
  {
  }

  public A(A p)
  {
     this.attr = p.Attr;
  }  
}

This would be an example, copying the member 'Attr' when building the new object.

참고URL : https://stackoverflow.com/questions/6569486/creating-a-copy-of-an-object-in-c-sharp

반응형