c # class - сделать вызов функции или метода и передать управление - PullRequest
0 голосов
/ 18 ноября 2010

Я не уверен, что мой заголовок действительно правильный. Я посмотрел вокруг и искал, но ничего не нашел, поэтому, пожалуйста, прости меня, если моя проблема уже была решена.

То, что я хотел бы сделать, это вызвать функцию, но не нужно возвращаться к вызывающей строке кода. * например 1003 *

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 ]

1 голос
/ 18 ноября 2010

Дайте мне посмотреть, понимаю ли я вопрос:

У вас есть функция Foo(), которая вызывает функцию Bar(). (Я хотел удалить рекурсию, которая была в вашем примере для простоты, пожалуйста, исправьте меня, если это было важно.) Когда функция Bar() возвращается, вы хотите, чтобы управление передавалось не обратно Foo(), а вызывающему Foo? *

Это возможно в языках более низкого уровня, таких как C, взломав стек и не поместив туда обратный адрес Foo(), так что когда Bar() попытается вернуться, он перейдет к вызывающей стороне Foo.

Однако в C # нет. Стек вызовов является стеком, и управление будет возвращаться по порядку. Единственное, что вы можете сделать, - это ставить оператор return после каждого вызова Bar().

Edit:

"рекурсивные вызовы без их рекурсивности"

Как насчет этого:

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 голосов
/ 18 ноября 2010

Я не уверен, что именно вы намереваетесь, но для меня это звучит как обратный звонок. Вот один из возможных примеров:

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

void RunMe() { }

void ReturnTo() { }

Вы запускаете в DoSome () и продолжаете, когда RunMe заканчивается, вызывается ReturnMe.

0 голосов
/ 18 ноября 2010

Если бы это был C ++, вы могли бы исключить break и позволить падать регистру "1", но это не разрешено в операторах переключения C #.

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

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

Вам нужен рекурсивный вызов? Этот код сохраняет ваш рекурсивный вызов и устанавливает obj.response "done" после изменения obj.id на "2". Однако obj.response устанавливается дважды из-за рекурсивного вызова. Что ты пытаешься сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...