2011-07-01 2 views
0

이 질문을하는 가장 쉬운 방법은 예제를 통해 모두 보여줄 수 있습니다.C# 한 루틴에서 다른 루틴으로 매개 변수 전달

private void exampleVoid(string someString, params string[] someArray_string) 
{ 
    // Do some dirty work 
    for(int i = 0; i < someArray_string.length; i++) 
    { 
     Console.WriteLine(someArray_string[i]); 
    } 

    // Recall the routine 
    exampleVoid("some string", someArray_string) 
} 

루틴의 맨 아래에서 배열을 다시 전달할 때 데이터가 제대로 처리되지 않습니다. 배열의 길이는 이제 0입니다.

왜 그럴까요?

+0

이 특별한 예제에는 무한 재귀 문제가 있지만 필자는 repro를 사용하지 않습니다. 이 문제를 설명하는 코드가 더 있습니까? – SirPentor

+0

코드를 추가하십시오. 당신이 준 코드는 적절하고, 컴파일되고,'someArray_string'의 길이를 변경하지 않으며 재귀적인 무한 루프입니다. – user7116

+0

물론 이것은 결코 끝나지 않을 것입니다. 이것은 배열을 전달하려는 방법을 보여주는 예일뿐입니다 ... –

답변

2

나는 다음 예제를 사용하여 모든에서 그 행동을 보이지 않아요? 디버거를 사용하고 있습니까? 이 함수를 어디에서 호출하고 있으며 어떤 인자를 전달하고 있습니까? 실제로 문자열을 두 번째 ... 마지막 인수로 전달하고 있습니까? 즉, 두 개 이상의 인수를 메서드에 전달하고 있습니까?

또한 재귀 호출 외에도 함수에서 돌아 오지 않기 때문에 결국은 StackOverflowException으로 충돌합니다. 전화는 결코 멈추지 않을 것입니다. 아마도 당신이 전적으로 다른 문제라고 생각하는 것의 원인이 될 수 있습니까?

1

어떻게 /Array_string을 초기화하는 중입니까? 그 어레이에 언제 다른 것을 추가합니까? 알 수 있듯이 빈 배열을 반복하면서 빈 요소 (들)를 콘솔에 작성하는 것입니다.

class Program 
{ 
    static void Main(string[] args) 
    { 
     Foo(5, "one", "two", "three"); 
     Console.ReadLine(); 
    } 

    static void Foo(int counter, params string[] parms) 
    { 
     if(counter <= 0) return; 

     foreach(var str in parms) 
     { 
      Console.WriteLine(str); 
     } 

     Foo(--counter, parms); 
    } 
} 

가 어떻게 someArray_string 첫 번째 재귀 호출 후 비어 있는지 결정됩니다

0

메서드 안의 배열에서 데이터를 제거하거나 수정하지 않았습니까? 배열은 참조로 전달됩니다. 나는 비슷한 문제에 직면하고 있었다

0

나는 예를 해봤 예상대로 그냥 ... 그래서, 나는 '무거운 처리가'정확히 무엇인지 궁금 작품 ...이를 포기했다 접근.

params 키워드를 사용하면 메소드가 가변 인수 목록을 사용할 수 있습니다. 메서드를 다시 호출하면 다음 호출로 전송되는 "someArray_string"이 배열이 아닌 하나의 매개 변수로 수신됩니다. 두 번째 호출에서 someArray_string [0]에 대한 값을 가지지 않습니까?