2010-04-24 3 views
4

이 경우배열을 사용하여 구조체를 복사 할 때 전체 복사본을 강제로 만드는 방법?

struct A { 
    public double[] Data; 
    public int X; 
} 

operator=를 사용하거나 컨테이너에 A의 인스턴스를 추가 할 때 어떻게 깊은 복사본을 강제 할 수 있습니까?

문제는, 예를 들면 :

A a = new A(); 
var list = new List<A>(); 
list.Add(a); // does not make a deep copy of Data 
A b = a; // does not make a deep copy of Data 

정말 모든 시간을 내 자신의 DeepClone 메소드를 구현하고 전화를해야합니까? 이것은 극단적으로 오류가 발생하기 쉽습니다 ...

답변

3

일반적으로 Array와 같은 가변 참조 유형을 구조체에 넣지 않도록해야합니다. this question 및 대답을 참조하십시오.

그래서 클래스를 참조 유형으로 만들고 DeepCopy 메소드를 제공하십시오. 또는 더 나은 방법 - 유형을 변경하지 않아도되므로 사본을 만들 필요가 없습니다.

+0

+1 : 가능한 경우 간단한 클래스를 변경하지 않는 것이 좋으며 사용하는 경우 오류 가능성이 줄어 듭니다. 예를 들어 딥 복사를 구현하더라도 코드 소비자가 실제로 사용한다는 보장은 없습니다. 특히 구조체의 경우, 변경 가능성은 예상하지 못합니다. –

1

직접 복사 방법을 직접 구현해야합니다. 이 작업을 수행 할

은 종종 API 디자이너는(), 복제 (부울 깊이), 또는 복사() 방법 A 복제를 디자인합니다.

ICloneable은 때때로 클래스를 복제 가능으로 표시하는 데 사용되지만 Clone() 메서드가 깊거나 얕은 경우 지정하지 않으므로 혼동 될 수 있습니다. Why should I implement ICloneable in c#?.

0

그렇게 할 방법이 없습니다. 자신의 깊은 복사 메커니즘을 구현해야합니다.

관련 문제