c#class - make函数或方法调用并传递控制

时间:2010-11-18 09:26:50

标签: c# methods

我不确定我的头衔是否真的正确。我环顾四周搜索但没找到任何东西,如果我的问题已经得到解答,请原谅我。

我想做的是调用一个函数,但不必回到调用代码行。 e.g

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)并完全通过控制。这是否有意义,是否可能,我的架构都错了?

感谢您的时间。

3 个答案:

答案 0 :(得分:1)

让我看看我是否理解这个问题:

你有一个函数Foo(),它调用函数Bar()。 (为了简单起见,我想删除你在例子中的递归,如果这很重要,请纠正我。)当函数Bar()返回时,你希望控制不再传递给Foo(),而是传递给Foo的呼叫者?

这可能是在较低级别的语言中,例如C,通过黑客攻击堆栈而不在那里放置Foo()的返回地址,这样当Bar()试图返回时,它会跳转到相反,Foo的来电者。

然而,在C#中,没有。调用堆栈是一个堆栈,控件将按顺序传回。您可以做的唯一事情是在每次调用return后添加Bar()语句。

修改

“没有递归的递归调用”

这个怎么样:

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

答案 1 :(得分: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 :(得分:0)

我不确定你到底想要什么,但这听起来像是对我的回调。这是一个可能的例子:

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

void RunMe() { }

void ReturnTo() { }

你从DoSome()开始并继续,当RunMe完成后,将调用ReturnMe。