Я задал вопрос ранее , но я не думаю, что достаточно четко определился с тем типом ответов, на которые я надеялся, поэтому позвольте мне привести более конкретный пример:
class Program
{
private static bool State;
static void Main(string[] args)
{
State = false;
Console.WriteLine(And());
Console.ReadLine();
}
static bool And()
{
return Or() && C();
}
static bool Or()
{
return A() || AB();
}
static bool C()
{
return State;
}
static bool A()
{
return true;
}
static bool AB()
{
State = true;
return true;
}
}
Поток этой программы выглядит так:
- И () вызывается
- И () вызывает Или ()
- Или () вызывает A ()
- A () возвращает true
- Поток возвращается к Or (), который возвращает true (ленивая оценка)
- Поток возвращается к А (), А () вызывает C ()
- C () возвращает false
- Поток возвращается к And (), который возвращает false
Теперь, если Or () не выполняет отложенную оценку (я изменяю ||
на |
), программа вернет true. Тем не менее, я не хочу, чтобы AB () выполнялась, пока не произойдет сбой результата всего анализа (And () вернет false).
Итак, что я хотел бы сделать, это где-нибудь в функции Or (), сохранить текущее состояние в стеке (статическая переменная), чтобы, если And () вернул false, я мог вытолкнуть элемент из стека и попробуйте альтернативу.
Как бы я это сделал в C #?