'How to break out of an IF statement

I have code like this:

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

Is there a possibility to go to that code after ifs without using any go to statement or extracting rest of the code to the other method?


Yes, I know Else ;)
But this code is farly long and should be run IF the first IF is false and when the first IF is true and the second is false. So extracting a method I think is the best idea.



Solution 1:[1]

You can use a goto to drop past some code. In the example, if thing1 is true then the check for things2 is bypassed.

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

Solution 2:[2]

This is a variation of something I learned several years back. Apparently, this is popular with C++ developers.

First off, I think I know why you want to break out of IF blocks. For me, I don't like a bunch of nested blocks because 1) it makes the code look messy and 2) it can be a PITA to maintain if you have to move logic around.

Consider a do/while loop instead:

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

    do
    {
        if (!something)
            break;

        if (something2)
            break;

    } while (false);
}

The do/while loop is guaranteed to run only once just like an IF block thanks to the hardcoded false condition. When you want to exit early, just break.

Solution 3:[3]

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

Same question

Long answer

Solution 4:[4]

Another way starting from C# 7.0 would be using local functions. You could name the local function with a meaningful name, and call it directly before declaring it (for clarity). Here is your example rewritten:

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 the code outside ifs
                return;
            }
            return;
        }
    }

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

Solution 5:[5]

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

Solution 6:[6]

In this case, insert a single else:

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

Generally: There is no break in an if/else sequence, simply arrange your code correctly in if / if else / else clauses.

Solution 7:[7]

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

Solution 8:[8]

You can return only if !something2 or use else return:

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

Solution 9:[9]

In your code example, you should simply run the code after the ifs inside the second if instead (or set a flag like someone else mentioned, depending on the context). Use method calls to improve readability and reduce nesting.

As for actually escaping ifs, I think there is a way that conforms much more to C# standards than the answers I've seen here. Simply extract the contents of the if statement to a separate method. This also increases readability. So:

public void Method()
{
    if(something)
    {
        //some code
        if (somethingelse)
        {
            //break if
        }

        //some other code running if the above if didn't trigger
    }
}

This can be accomplished as such:

public void Method()
{
    if(something)
    {
        DoSomething();
    }
}

public void DoSomething()
{
    //some code
    if (somethingelse)
    {
        return;
    }

    //some other code running if the above if didn't trigger
}

Solution 10:[10]

You can also use a lambda

if (new Func<bool>(() =>
{
    if (something1)
    {
        // Some code that calculates "something2"
        if (something2)
        {
            // Now I should break from ifs and go to the code outside ifs
            return true;
        }
    }
    return false;
})())
{
    // The code I want to go if the second if is true
}

P.S. I think I know why people would want this. "Run stuff if all conditions are true, otherwise run other stuff". And the conditions are too complicated to put into one if or they depend one on another.

Solution 11:[11]

Try adding a control variable:

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

Solution 12:[12]

Another variant that may be really useful in more complicated cases:

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