2010-11-18 5 views
0

내 제목이 맞는지 확실하지 않습니다. 나는 주변을 둘러 보았지만 찾았지만 아무 것도 발견하지 못했습니다. 제 문제가 이미 답변 되었다면 용서해주세요.C# class - 함수 호출 또는 메서드 호출 및 제어 전달

내가하고 싶은 것은 함수를 호출하지만 코드 호출 줄로 돌아갈 필요가 없다는 것입니다. 예 :

public static void temp(obj) { 
    switch (obj.id) { 
    case "1" : 
     if(blah) { 
     obj.id = "2"; 
     temp(obj); 
     } 
     break; 
    case "2" : 
     obj.response = "done"; 
     break; 
    } 
} 

기본적으로 첫 번째 경우에는 결국 임시 직원 (obj)으로 돌아가고 완전히 제어하려고합니다. 이것이 합리적인가요? 심지어 가능하며 건축은 모두 잘못 되었습니까?

감사합니다.

+0

** 아니요 ** 이것은 의미가 없습니다. 재귀 호출을하고 있습니다 –

답변

1

내가 질문을 이해한다면 나를 보자. (단순함을 위해 예제에서 사용한 재귀를 제거하고 싶었지만 중요한 경우이를 수정하십시오.) 함수 Bar()이 반환되면 Foo()이 아닌 Foo의 호출자에게 전달할 컨트롤을 원하십니까?

Bar()이 반환하려고 시도 할 때 Foo()의 복귀 주소를 배치하지 않으므로 C와 같은 하위 언어에서 스택을 해킹하여 Foo의 호출자로 대신 이동할 수 있습니다.

그러나 C#에서는 아니요. 호출 스택은 스택이며 컨트롤은 순서대로 전달됩니다. 당신이 할 수있는 유일한 일은 각각 Bar()을 호출 한 후에 return 문장을 넣는 것입니다.

편집 :

이 방법에 대해 "그들없이 재귀 호출 재귀되는"

bool doItAgain = true; 
while(doItAgain) 
{ 
    doItAgain = false; 

    // process, with your switch statement or whatever. 

    if(...) 
    { 
     doItAgain = true; 
     continue; // if necessary, skip any code after this statement. May not be necessary if you have things set up right. 
    } 
} 
+0

답장을 보내 주셔서 감사합니다. 나는 재귀 적 호출이 아닌 재귀 호출을 원한다. 심지어 지금 입력하는 것조차 그것이 가능하지 않다는 것을 명백하게합니다. – Shannow

0

이 코드가 C++ 인 경우 break을 제거하고 대문자 "1"을 쓰도록 허용 할 수 있지만 C# switch 문에서는 사용할 수 없습니다.

public static void temp(obj) { 
    if (obj.id == "1") { 
     obj.id = "2"; 
     temp(obj); 
    } 

    if (obj.id == "2") 
     obj.response = "done"; 
} 

재귀 호출이 필요합니까? 이 코드는 재귀 호출을 유지하고 obj.id를 "2"로 변경 한 후 obj.response를 "done"으로 설정합니다. 그러나 obj.response는 재귀 호출로 인해 두 번 설정됩니다. 너 뭐하려고?

당신은 기능 Bar()를 호출하는 기능 Foo()를 가지고 :

+0

기본적으로 scorm sequencing 모듈을 구현하고 있습니다. obj는 객체가 시퀀싱 함수를 통해 전달 될 때마다 변경되는 데이터 및 응답 문자열을 갖는 시퀀스 클래스를 나타냅니다. 나는 내가 원했던 것이 가능하지 않았지만 먼저 확인하고 싶었다고 생각했다. 시간 내 주셔서 감사 드리며, 제 구조를 다시 생각해 보겠습니다. – Shannow

0

난 당신이 정확히 의도가 무엇인지 모르겠지만,이 같은 소리 콜백. 가능한 한 가지 예가 있습니다 :

void DoSome() 
{ 
    ThreadPool.QueueUserWorkItem(new WaitCallback(delegate { RunMe(); ReturnTo(); })); 
} 

void RunMe() { } 

void ReturnTo() { } 

DoMome()에서 시작하여 RunMe가 끝나면 ReturnMe가 호출됩니다.

+0

미안해, 나는 성급하게 말했어.조금 테스트 한 후 재귀가 필요하다는 것을 깨달았습니다. 변경된 객체를 함수에 전달하고 제어를 포기하지 말고 원래의 스레드를 완전히 제어하고 드롭해야합니다. 이것은 멋지다. 그리고 그것을 다른 곳에 구현했다. – Shannow

+0

참조 유형 인 객체를 사용하기 때문에 매개 변수로 RunMe와 ReturnTo에 전달할 수 있습니다. ReturnTo는 점검 (재귀 종료)을 수행하고 변경된 오브젝트로 RunMe를 다시 호출 할 수 있습니다 ... – Jaster