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; 
    } 
} 

ので基本的に私は最終的には最初のケースに戻って私のTEMP(OBJ)に来て、完全に制御を渡したいいけません。これは意味をなさないでしょうか、私の建築はすべて間違っていますか?

ありがとうございます。

+0

**いいえ、**これは意味がありません。あなたは再帰呼び出しを行っています –

答えて

1

は、私が質問を理解していれば見てみましょう。 (私は単純化のためにあなたの例で持っていた再帰を削除したかったので、それが重要であれば修正してください。)関数Bar()が返ってくると、制御はFoo()に戻るのではなく、Fooの呼び出し元に渡されますか?

これはCのような、Bar()を返すようにしようとしたとき、それは代わりにはFooの呼び出し側にジャンプなるように、スタックをハッキングし、そこ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

あなたの返事Davidに感謝します。私は再帰的な呼び出しをしたいと思っています。今でもそれを入力することは、それが不可能であることを明らかにします。 – 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は再帰呼び出しのために2回設定されます。あなたは何をしようとしているのですか?

あなたが機能Bar()を呼び出す関数Foo()を、持っている:

+0

私は基本的にscorm sequencingモジュールを実装しています。 objはデータとレスポンス文字列を持つシーケンスクラスを表し、オブジェクトがシーケンシング関数を通過するたびに変更されます。私が望んでいたことは不可能だと思ったが、まずチェックしたかった。あなたの時間をありがとう、私は私の構造を再考する。 – Shannow

0

私はあなたが正確に意図しかわからないんだけど、それはのように聞こえます私にコールバック。 RUNMEがReturnMeが呼び出された終了すると、

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

void RunMe() { } 

void ReturnTo() { } 

あなたはDoSomeに開始()と継続:ここでは1つの可能な例です。

+0

申し訳ありません私は早めに話したと思います。少しテストした後、私は再帰が必要だと分かりました。変更されたオブジェクトを関数に渡す必要があります。制御を放棄する代わりに、完全な制御を与えて元のスレッドを削除する必要があります。これは涼しいですが、どこでそれを実装しましたか。 – Shannow

+0

オブジェクト(参照型)を使用するので、それをパラメータとしてRunMeに渡し、ReturnToに渡すこともできます。 ReturnToはチェック(再帰出口)を実行し、変更されたオブジェクトでRunMeを再度呼び出すことができます... – Jaster

関連する問題