我不确定我的头衔是否真的正确。我环顾四周搜索但没找到任何东西,如果我的问题已经得到解答,请原谅我。
我想做的是调用一个函数,但不必回到调用代码行。 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)并完全通过控制。这是否有意义,是否可能,我的架构都错了?
感谢您的时间。
答案 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。