2012-04-09 4 views
1

는 난이 인 myArr 같은 모든 값을 발생Enumerable.Repeat에 메모리 문제가 있습니까?

같이

Double[][] myarr = Enumerable.Repeat(new double[12], 13).ToArray(); 

이어서 루프 나 증가하고 값

으로 배열 초기화 [1] [0] 인 myArr [2] [0] , myarr [3] [0] ..... myarr [12] [0]은 1 씩 증가합니다. 루프 (0-12) 내가

myarr[i] = new double[12]; 

같은 초기화하고 위해가 왜 이렇게이다 사용하는 경우

이 문제는 발생되지 않는 이유는 무엇입니까?

답변

5

다른 답변으로 인해 문제가 설명되었습니다. 해결책은 각각의 반복에서 새로운 배열을 생성하는 것입니다.

double[][] myarr = Enumerable.Range(0, 13) 
          .Select(ignored => new double[12]) 
          .ToArray(); 
1

배열은 참조 용입니다. 호출에서 하나의 배열을 만들고 참조를 12 번 할당합니다. 그러나 루프에서는 12 개의 별개의 배열을 만듭니다. new double[12] 함께

2

은 복식의 배열에 대한 참조를 생성하고, 그 다음 그렇게 인 myArr [0..N 하나 개의 메모리 영역에 대한 참조를 가질 것이라고 참조 12 회 repeate.

당신은 THW 문제

static T[][] CreateArray<T>(int rows, int cols) 
{ 
    T[][] array = new T[rows][]; 
    for (int i = 0; i < array.GetLength(0); i++) 
     array[i] = new T[cols]; 

    return array; 
} 

또는 행동 모든 단계를 호출하는 사용자 정의 반복 방법을 해결하기 위해 folowing 방법을 사용할 수 있습니다 :

public static IEnumerable<TResult> RepeatAction<TResult>(Action<TResult> elementAction, int count) 
{ 
    for (int i = 0; i < count; i++) 
    { 
     yield return elementAction(); 
    } 
    yield break; 
} 
usage 
RepeatAction(()=>new double[12], 12); 
2

new double[12] 메모리에 하나의 배열 객체를 생성 때문입니다 - Enumerable.Repeat는 단순히 해당 배열에 대한 여러 참조를 제공합니다.

+0

이러한 기능 (해당 배열에 대한 다중 참조)의 용도는 무엇입니까? 배열에 잘못된 값을줍니다. –

1

Repeat()은 기본적으로 동일한 요소를 여러 번 캡처하고 산출하므로 메모리의 동일한 객체 인스턴스에 대한 참조가 여러 개 있습니다.

Repeat() 구현 방법입니다 :

이것은 예상 된 동작입니다
private static IEnumerable<TResult> RepeatIterator<TResult>(TResult element, int count) 
{ 
    for (int i = 0; i < count; i++) 
    { 
     yield return element; 
    } 
    yield break; 
} 
2

- 배열이 referebce 유형입니다. 들쭉날쭉 한 배열, 즉 배열의 배열을 만들고 있습니다. 외부 배열의 모든 요소는 동일한 내부 배열, 즉 Repeat 호출의 첫 번째 인수를 참조하므로 내부 배열의 변경 사항은 인덱스에 반영됩니다 (모든 인덱스는 동일한 배열을 참조하기 때문에).

+0

해당 시설의 사용은 무엇입니까 (해당 배열에 대한 다중 참조)? 배열에 잘못된 값을줍니다. –

관련 문제