C#에서 Copyto와 같은 Memcpy ()를 구현하는 쉬운 방법
문제
다음과 같은 것을 구현하는 "쉬운"방법이 있습니까? CopyTo()
에게 MemberwiseCopy
(대신에 Clone()
또는 MemberwiseClone
) C#에서? 나는 오래된 객체를 만들고 싶지 않기 때문에 오래된 객체를 잡고있는 모든 사람들이 완전히 다른 객체의 속성을 볼 수 있기를 원합니다. 이들 대부분은 추상 기능을 보유 할 수있는 부모 클래스에서 파생되지만 모든 멤버를 하나씩 복사하기 위해 수백 줄의 코드를 작성하고 싶지 않습니다. 모든 (나쁜 디자인이지만 내 것이 아니라 다시 작성되지도 않음)에 대해 복사해야 할 수도 있습니다. Microsoft가 이것에 대한 인터페이스를 만들었을 것 같거나 무언가를 크게 놓친 것 같습니다.
해결책
직렬화/사제화가이를 수행하는 "가장 쉬운"방법이라고 생각합니다. 추가로, 고정 된 핸들을 사용하여 더 빠른 방법이 있습니다.
당신은 마샬 & gchandle을 사용할 수 있습니다 ( 이 링크 ):
public static object RawDeserializeEx( byte[] rawdatas, Type anytype )
{
int rawsize = Marshal.SizeOf( anytype );
if( rawsize > rawdatas.Length )
return null;
GCHandle handle = GCHandle.Alloc( rawdatas, GCHandleType.Pinned );
IntPtr buffer = handle.AddrOfPinnedObject();
object retobj = Marshal.PtrToStructure( buffer, anytype );
handle.Free();
return retobj;
}
public static byte[] RawSerializeEx( object anything )
{
int rawsize = Marshal.SizeOf( anything );
byte[] rawdatas = new byte[ rawsize ];
GCHandle handle = GCHandle.Alloc( rawdatas, GCHandleType.Pinned );
IntPtr buffer = handle.AddrOfPinnedObject();
Marshal.StructureToPtr( anything, buffer, false );
handle.Free();
return rawdatas;
}
다른 팁
나는 질문을받지 못한다. 기존 객체에 대한 참조를 만들고 싶은 것처럼 들립니다.
C#의 개체에 대한 변수 단지 객체에 대한 참조를 보유하므로 기존 객체에 변수를 할당 할 때 여전히 동일한 객체에 액세스하고 있습니다.
Object x = new Object();
Object y = x;
x.MyProperty = "hello";
위의 코드의 경우 y.myproperty == "hello"도.
참조 유형을 가진 모든 필드가 원래 참조 된 객체 인 Ad Infinitum의 멤버 위시 클론 ()으로 설정되는 딥 카피를 얻으려고합니까?
직렬화를 메모리 스트림으로 사용하고 인스턴스로 다시 사로화 할 수 있습니다.
우리는 프로젝트에 그러한 "심해"방법이 있습니다. 그것은 일종의 위험합니다. 우리는 카피 프로 테티-방법 또는 복사 생성자를 수업에 구현하기 시작했습니다.
다른 인스턴스의 값으로 객체의 모든 기존 필드를 덮어 쓰고 싶다면 쉬운 그것을하는 방법. 객체의 각 필드를 방문하고 값을 복사하기 위해 엉뚱한 반사 코드를 기꺼이 작성하려는 경우 수행 할 수 있습니다. 그러나 그것은 깨지기 쉽고 지저분 할 것입니다.
또한 올바르게하려면 객체의 상속 트리를 걷고 동일한 할당 작업을 수행해야합니다.
마지막으로 객체에 포함 된 경우 readonly
필드, 다른 인스턴스의 정확한 상태를 복사하는 것은 불가능할 수 있으며, 일관성없는 사본이 사본의 허용 가능한 결과인지 여부를 결정해야합니다.