2009-10-23 8 views
1

숫자를 나타내는 BigNumDesc라는 클래스를 사용하고 있습니다. 그 수의 들쭉날쭉 한 배열이 매트릭스를 나타냅니다. 내가 먼저이 행렬을 다음과 같은 방법을 선언딥 복사 참조 유형

static BigNumDec[][] GetStrictlyUpperTriangle(BigNumDec[][] matrix) 
{ 
    BigNumDec[][] newMatrix = new BigNumDec[matrix.Length][]; 
    matrix.CopyTo(newMatrix, 0); 
    return null; 
} 

내가 마지막 줄에 중단 점을 가지고

BigNumDec[][] matrix = new BigNumDec[][] { 
     new BigNumDec[] { 1, 2 }, 
     new BigNumDec[] { 3, 4 } 
    }; 

지금, 내가 전화 할이 방법을 가지고있다. 조사 식 창에서 행렬의 항목을 가져 와서 변경하면 newMatrix도 변경됩니다. 모든 BigNumDec은 참조 유형입니다 (작성자의 잘못된 설계 결정). 이것을 어떻게 할 수 있습니까? newMatrix를 수정해야하므로 먼저 매트릭스에서 복사해야합니다.

편집 : int와 동일하게 시도했지만, 이제는 똑같은 일이 발생합니다. 가치 유형으로는 그런 일이 일어나지 않겠습니까?

BigNumDec은 변경 불가능합니다.

답변

3

배열의 배열을 사용하고 있기 때문에 값 유형이 계속 발생하는 이유가 있습니다. 두 개의 "내부"배열에 대한 참조를 복사하는 "외부"배열을 얕은 복사합니다.

BigNumDec이 불변인지 여부를 표시하지 않았지만 (그렇 으면 좋겠지 만) 그래도 배열을 완전히 복사하면 좋을 것입니다. 또는 직사각형 배열 [,] 대신 지그재그 형 배열 [][]을 사용할 수 있습니까? 그렇다면 간단한 복사만으로 충분할 것입니다. 직사각형 배열에는 성능에 영향이 있습니다.이 배열이 문제인지 여부를 테스트 해 볼 가치가 있습니다. 참조의 지역성이 향상되지만 실제 배열 액세스는 빠르지 않습니다.

+0

int는 잘 작동합니다. BigNumDec과 잘 작동합니까? 나는 안된다고. –

+0

작동하는 것 같습니다. 이제 혼란스러워. –

+0

가능하다면 왜 불변인지 아닌지를 설명해 주시겠습니까? 값을 변경하고 싶다는 것을 감지하면 새로운 값을 생성합니까? –

1

BigNumDec 배열을 초기화 할 때 BigNumDec 객체의 1 차원 배열이 생성됩니다. [0] = {1, 2}, [1] = {3.4}. 그런 다음 내용이 아닌 참조를 효과적으로 복사하고 있으므로 값이 계속 변경되는 이유는 무엇입니까? 당신의 객체가 직렬화 경우 직렬화를 사용하여 깊은 사본을 구현할 수

BigNumDec[,] matrix = new BigNumDec[,] { 
    { 1, 2 }, 
    { 3, 4 } 
}; 
1

:

는 귀하의 초기 설정을 변경

. 성능면에서는별로 좋지 않지만 간단합니다.

public BigNumDec[][] CopyUsingSerialization(BigNumDec[][] original) 
{ 
    var binaryFormatter = new BinaryFormatter(); 
    var serializationStream = new MemoryStream(); 
    binaryFormatter.Serialize(serializationStream, original); 
    serializationStream.Position = 0; 
    var copy = (BigNumDec[][])binaryFormatter.Deserialize(serializationStream); 
    return copy; 
} 

당신은 [직렬화]로 BigNumDec을 선언해야 : 다른 답변에서 말했다

[Serializable] 
public class BigNumDec 
{ 
    //class content 
} 

(여기에, 당신은 당신이거야 들쭉날쭉 대신 두 차원 배열로 이동할 수있는 경우 더 나은 솔루션을 얻으십시오)