Как выйти из «рамок»? - PullRequest
       35

Как выйти из «рамок»?

1 голос
/ 23 октября 2019

Можно ли выйти из области видимости в C #, например, можно break выйти из цикла?

private void a()
{
    // do stuff here

    {
        // do more stuff here

        break;? //<-- jump out of this scope here!! break won't work

        // this further code should not be executed
    }

    // do stuff here
}

Ответы [ 2 ]

2 голосов
/ 23 октября 2019

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

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

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

Вместо:

DoSomething();
if (a == 1) // conditional break
{
    break;
}
DoSomethingElse();
break; // unconditional break (why though)
UnreachableCode(); // will generate compiler warning, by the way

Вы можете сделать:

DoSomething();
if (a != 1) // simple condition
{
    DoSomethingElse();
    if (false) // why though
    {
        UnreachableCode(); // will generate compiler warning, by the way
    }
}

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

private void a()
{
    // do stuff here

    MeaningfulNameToDescribeWhatYouDo();

    // do stuff here
}

private void MeaningfulNameToDescribeWhatYouDo()
{
    // do more stuff here

    if (condition)
    {
        return; //<-- jump out of this scope here!!
    }

    // this further code should not be executed
}     
1 голос
/ 23 октября 2019

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

Есть способы использовать их ответственно, но из вашего вопроса кажется, что вы не уверены, как правильно использовать операторы if / else / while и т.д. Вместо этого лучше использовать надлежащие средства управления потоком.

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/goto

...