2013-06-15 9 views
0

개체를 '복사'해야합니다. 내가 쓸모와 IClonable 인터페이스를 사용하여 시도하고 나에게 가장 감각적 인 솔루션은 개체에 대한 포인터를 만들고 다음 Memcpy C와 같은 메서드를 작성하는 안전하지 않은 코드를 사용하는 것입니다. 유일한 문제는 관리되는 형식에 대한 포인터를 만드는 것입니다 . 그런 일을하면 가비지 수집기에 문제가 발생할 것이라고 가정하고 있지만 관리 대상 객체에 대한 포인터를 만들기 위해 마샬링이나 다른 방법을 사용할 수 있다면 memcpy와 같은 함수를 작성하여 객체를 복사 할 수 있습니다. 구조체가 관리되지 않는 경우 개체가없는 이유는 무엇입니까? 객체는 기본적으로 구조체 포인터이므로 이론적으로는 IntPtr의 크기와 같아야합니다.C# 개체에 대한 포인터?

+0

복사하려는 대상은 무엇입니까? 어떻게 IClonable.Clone 메서드를 구현 했습니까? 'Clone()'메소드를 호출 했습니까? C# 개체를 복사하여 C 프로그램으로 전달하려고합니까? –

+0

물론 그랬습니다. 내 개체에는 복제되지 않는 List 개체가 포함되어 있습니다. IClonable 인터페이스는 얕은 복제를위한 메서드 만 제공한다는 사실과 관련이 있습니다. – user1454902

+3

이러한 아이디어는 매우 나쁩니다. 복사 생성자를 만들거나'IClonable'을 구현하면 문제가되지 않습니다. 새 객체의 모든 값을 이전 객체의 값과 동일하게 설정하는 메소드를 작성해야합니다. – evanmcdonnal

답변

3

포인터를 사용하는 것에 대한 나의 생각을 말한 사람들을 위해, C로 내 배경에서 나온 것입니다. 어쨌든이 메서드는 직렬화를 사용하여 정확하게 필요한 것을 수행했습니다.

public object Clone() 
    { 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      BinaryFormatter formatter = new BinaryFormatter(); 
      formatter.Serialize(ms, this); 
      ms.Position = 0; 
      return formatter.Deserialize(ms); 
     } 
    } 
+0

이것은 복잡한 개체의 전체 복사본을 만드는 좋은 방법입니다. – evanmcdonnal

+1

@user, 솔루션을 찾은 뒤 기쁜 마음으로 여기에 게시하십시오. 나는이 방법을 직접 사용했다. 그러나 귀하의 질문에 가정은 C# (CLR 또는 JVM의 Java)과 같은 관리 언어가 실제로 어떻게 작동하는지에 대해 오해가 있음을 나타냅니다. 무엇보다 먼저 객체를 "복사"하여 새로운 객체에 도착할 수 있다는 개념은 가비지 수집의 개념을 무시합니다. GC 시스템은 결국 그 메모리를 할당 해제 할 필요가 있음을 어떻게 알 수 있을까요? (CLR은 CLR이 전혀 작동하지 않도록 모든 개체를 알고 있어야합니다.) –

관련 문제