Как вырваться из утверждения IF

У меня такой код:

public void Method()
{
    if(something)
    {
        //some code
        if(something2)
        {
            now I should break from ifs and go to te code outside ifs
        }
    return;
    }
    // The code i want to go if the second if is true
}

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

Update:

Да, я знаю Else;) Но этот код длинный и должен быть запущен, если первый IF является ложным и когда первый IF равен true, а второй - false. поэтому метод извлечения я считаю лучшей идеей

Ответ 1

Чтобы ответить на ваш вопрос:

public void Method()
{
    while(true){
        if(something)
        {
            //some code
            if(something2)
            {
                break;
            }
        return;
        }
        break;
    }
    // The code i want to go if the second if is true
}

Ответ 2

Используйте else:

if(something)
{
     //some code
     if(something2)
     {
           // now I should break from ifs and go to te code outside ifs
     }
     else return;
 }
 // The code i want to go if the second if is true

Ответ 3

Вы можете использовать goto, чтобы пропустить какой-то код. В этом примере, если thing1 имеет значение true, тогда проверка вещей2 обойдена.

if (something) {
    do_stuff();
    if (thing1) { 
        do_thing1();
        goto SkipToEnd;
    }
    if (thing2) {
        do_thing2();
    }
SkipToEnd:
    do_thing3();
}

Ответ 4

Это вариант того, что я узнал несколько лет назад. По-видимому, это популярно среди разработчиков C++.

Прежде всего, я думаю, я знаю, почему вы хотите вырваться из блоков IF. Для меня, мне не нравится куча вложенных блоков, потому что 1) код выглядит беспорядочно и 2) его можно поддерживать, если вам нужно перемещать логику.

Рассмотрим вместо этого цикл do/while while:

public void Method()
{
    bool something = true, something2 = false;

    do
    {
        if (!something) break;

        if (something2) break;

    } while (false);
}

Цикл do/while while гарантированно выполняется только один раз, как блок IF, благодаря жестко закодированному false условию. Если вы хотите выйти рано, просто break.

Ответ 5

public void Method()
{
    if(something)
    {
    //some code
        if(something2)
        {
           // now I should break from ifs and go to te code outside ifs
           goto done;
        }
        return;
    }
    // The code i want to go if the second if is true
    done: // etc.
}

тот же вопрос

длинный ответ

Ответ 6

В этом случае вставьте один else:

public void Method()
{
    if(something)
    {
        // some code
        if(something2)
        {
            // now I should break from ifs and go to te code outside ifs
        }
        else return;
    }
    // The code i want to go if the second if is true
}

Как правило: в последовательности if/else нет break, просто упорядочите свой код в предложениях if / if else / else.

Ответ 7

public void Method()
{
    if(something)
    {
        //some code
        if(!something2)
        {
            return;
        }
    }
    // The code i want to go if the second if is true
}

Ответ 8

public void Method()
{
    if(something)
    {
        //some code
        if(something2)
        {
            // The code i want to go if the second if is true
        }
    return;
    }
}

Ответ 9

Вы можете return, только если !something2 или использовать else return:

public void Method()
{
    if(something)
    {
        //some code
        if(something2)
        {
            //now I should break from ifs and go to te code outside ifs
        }
        if(!something2) // or else
            return;
    }
    // The code i want to go if the second if is true
}

Ответ 10

Я думаю, я знаю, почему люди хотят этого. Msgstr "Запустить вещи, если все условия выполняются, иначе запустить другие вещи". И условия слишком сложны, чтобы их можно было объединить, if.

Просто используйте лямбду!

if (new Func<bool>(() =>
{
    if (something1)
    {
        if (something2)
        {
            return true;
        }
    }
    return false;
})())
{
    //do stuff
}

Ответ 11

Попробуйте добавить управляющую переменную:

public void Method()
{
    bool doSomethingElse = true;
    if(something)
    {
        //some code
        if(!something2)
        {
            doSomethingElse = false;
        }
    }
    if(doSomethingElse)
    {
        // The code i want to go if the second if is true
    }
}

Ответ 12

Другой способ, начиная с c # 7.0, - использовать локальные функции. Вы можете назвать локальную функцию значимым именем и вызвать ее непосредственно перед объявлением (для ясности). Вот ваш пример переписан:

public void Method()
{
    // Some code here
    bool something = true, something2 = true;

    DoSomething();
    void DoSomething()
    {
        if (something)
        {
            //some code
            if (something2)
            {
                // now I should break from ifs and go to te code outside ifs
                return;
            }
            return;
        }
    }

    // The code i want to go if the second if is true
    // More code here
}

Ответ 13

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

try {
    if (something)
    {
        //some code
        if (something2)
        {
            throw new Exception("Weird-01.");
            // now You will go to the catch statement
        }
        if (something3)
        {
            throw new Exception("Weird-02.");
            // now You will go to the catch statement
        }
        //some code
        return;
    }
}
catch (Exception ex)
{
    Console.WriteLine(ex); // you will get your Weird-01 or Weird-02 here
}
// The code i want to go if the second or third if is true